Apache spark 在Spark中读取数据时编码困难

Apache spark 在Spark中读取数据时编码困难,apache-spark,pyspark,Apache Spark,Pyspark,关于我之前的发言,当我发出命令时 filePath = sc.textFile("/user/cloudera/input/Hin*/datafile.txt") filePath.collect() 数据的某些部分在每个单词前都有“\xa0”前缀,而数据的其他部分没有该特殊字符。我附上2张图片,一张带有'\xa0',另一张没有'\xa0'。两张图片中显示的内容属于同一文件。Spark仅以这种方式读取同一文件中的部分数据。我已经检查了HDFS中的原始数据文件,它没有问题 我觉得这与编码有关。我

关于我之前的发言,当我发出命令时

filePath = sc.textFile("/user/cloudera/input/Hin*/datafile.txt")
filePath.collect()
数据的某些部分在每个单词前都有“\xa0”前缀,而数据的其他部分没有该特殊字符。我附上2张图片,一张带有'\xa0',另一张没有'\xa0'。两张图片中显示的内容属于同一文件。Spark仅以这种方式读取同一文件中的部分数据。我已经检查了HDFS中的原始数据文件,它没有问题

我觉得这与编码有关。我尝试了所有的方法,比如在flatMap中使用
replace
选项,比如
flatMap(lambda行:line.replace(u'\xa0','').split(“”)
flatMap(lambda行:line.replace(u'\xa0',u')).split(“”)
,但是没有一种方法对我有效。这个问题可能听起来很糟糕,但我是使用ApacheSpark的新手,我需要一些帮助来克服这个问题


有人能帮我吗?提前感谢。

检查文件的编码。使用
sc.textFile
时,spark需要一个UTF-8编码的文件。 解决方案之一是使用
sc.binaryFiles
获取文件,然后应用预期的编码

sc.binaryFile
创建一个键/值rdd,其中键是文件的路径,值是以字节表示的内容。 如果只需要保留文本并应用解码功能,则:

filePath = sc.binaryFile("/user/cloudera/input/Hin*/datafile.txt")
filePath.map(lambda x :x[1].decode('utf-8')) #or another encoding depending on your file

检查文件的编码。使用
sc.textFile
时,spark需要一个UTF-8编码的文件。 解决方案之一是使用
sc.binaryFiles
获取文件,然后应用预期的编码

sc.binaryFile
创建一个键/值rdd,其中键是文件的路径,值是以字节表示的内容。 如果只需要保留文本并应用解码功能,则:

filePath = sc.binaryFile("/user/cloudera/input/Hin*/datafile.txt")
filePath.map(lambda x :x[1].decode('utf-8')) #or another encoding depending on your file

比如
filePath=sc.binaryFiles(“/user/cloudera/Hin*/datafile.txt”)
?那么我应该在哪里使用编码方法?请详细说明一下?我应该在哪里添加地图功能
filePath.flatMap(lambda-line:line.split(“”)).filter(lambda-w:w.lower()在words中)。map(lambda-word:(word,1)).reduceByKey(add)
我想搜索预定义的单词并计算它们出现的次数。这是我前面问题的最后一个部分。@johnder您从我写的decode函数开始。然后应用您的计数。例如,前两行将是您的代码,然后是
filePath.flatMap(lambda-line:line.split(“”)).filter(lambda-w:w.lower(),单词中的lower()).map(lambda-word:(单词,1)).reduceByKey(add)
将是第三行,最后是
collect()
,对吗?就像
filePath=sc.binaryFiles一样(“/user/cloudera/Hin*/datafile.txt”)
?那么我应该在哪里应用编码方法?你能详细说明一下吗?我应该在哪里添加映射函数吗?
filePath.flatMap(lambda line:line.split(“”)。filter(lambda w:w.lower()在words中)。map(lambda word:(word,1)).reduceByKey(add)
我想搜索预定义的单词并计算它们出现的次数。这是我前面问题的关键。@johnder您从我编写的decode函数开始。然后应用计数。例如,前两行将是您的代码,然后是
filePath.flatMap(lambda line:line.split(“”)。filter(lambda w:w.lower()).map(lambda word:(word,1)).reduceByKey(add)
将是第三行,最后是
collect()
,对吗?