我在使用以下版本的Spark和Python时遇到了同样的问题:
SPARK - 2.4.0
Python - 2.7.5
上述解决方案对我都不起作用。
对我来说,问题出现在尝试将结果RDD保存到HDFS位置时。我是从HDFS位置获取输入,并将其保存到相同的HDFS位置。下面是当出现此问题时用于读取和写入操作的代码:
读取输入数据:
monthly_input = sc.textFile(monthly_input_location).map(lambda i: i.split("\x01"))
monthly_input_df = sqlContext.createDataFrame(monthly_input, monthly_input_schema)
写入到HDFS:
result = output_df.rdd.map(tuple).map(lambda line: "\x01".join([str(i) for i in line]))
result.saveAsTextFile(output_location)
我分别将读取和写入代码更改为以下代码:
读取代码:
monthly_input = sqlContext.read.format("csv").option('encoding', 'UTF-8').option("header", "true").option("delimiter", "\x01").schema(monthly_input_schema).load(monthly_input_location)
编写代码:
output_df.write.format('csv').option("header", "false").option("delimiter", "\x01").save(output_location)
不仅解决了问题,而且大大提高了IO性能(几乎提高了3倍)。
但是,在使用上述写入逻辑时,存在一个已知的问题,我尚未找到合适的解决方案。如果输出中有空字段,则由于CSV编码,它将显示用双引号(“”)括起来的空值。
对我来说,这个问题目前并不是很重要。无论如何,我都会将输出加载到Hive中,在那里可以在导入时删除双引号。
附注:我仍在使用SQLContext。尚未升级到SparkSession。但从我迄今为止尝试的情况来看,基于SparkSession的类似读取和写入操作也将类似地工作。
show
时才会遇到这种情况吗? - zero323rdd.take(20)
可以正常执行吗?如果可以,问题可能是标题。无论如何,您能否提供一个最小的数据样本,用于重现问题? - zero323