如何将Spark DataFrame保存为HDFS上的CSV文件?

6

Spark版本:1.6.1,我使用pyspark API。

DataFrame:df,其中有两列。

我尝试过:

1: df.write.format('csv').save("hdfs://path/bdt_sum_vol.csv")
2: df.write.save('hdfs://path/bdt_sum_vol.csv', format='csv', mode='append')
3: df.coalesce(1).write.format('com.databricks.spark.csv').options(header='true').save('hdfs://path/')
4: df.write.format('com.databricks.spark.csv').save('hdfs://path/df.csv')

(All above didn't work, Failed to find data source)

或者:

def toCSVLine(data):
    return ','.join(str(d) for d in data)

lines = df.rdd.map(toCSVLine)
lines.saveAsTextFile('hdfs://path/df.csv')  

(Permission denied)

Q:

1、如何解决“无法找到数据源”的问题?

2、我使用sudo在hdfs上创建了字典“/path”,如果我将数据框转换为rdd,如何将rdd写入到hdfs上的csv文件中?

非常感谢!


你正在运行哪个版本的Databricks:--packages com.databricks...? - jmunsch
如果您可以在同一台服务器上使用hadoop,那么似乎是用户权限问题。请执行以下操作:hadoop chown user:user /path,其中user是您运行Spark代码的用户。 - Chitral Verma
  1. 尝试不带"hdfs:/"的路径
  2. lines.repartition(1).saveAsTextFile('/pyth/df.csv')
同时检查您是否具有对HDFS的读写权限。
- sdikby
我解决了这个问题。1、获得访问权限。2、将RDD的每一行转换为字符串,并使用saveAsTextFile()将结果保存到part-***中。或者,3、如果我使用save(),我应该像这样提交应用程序:spark-submit --packages com.databricks:spark-csv_2.10:1.5.0 /path,这样我就可以保存它!谢谢大家! - Leah210
尝试使用'file:///path/df.csv'代替'hdfs://path/df.csv'。 - Grant Shannon
2个回答

2
您可以尝试将“.save”更改为“.csv”:最初的回答
df.coalesce(1).write.mode('overwrite').option('header','true').csv('hdfs://path/df.csv')

1
如果 hdfs://yourpath/ 不起作用
尝试这个,在我的情况下它有效:
df.coalesce(1).write.format('com.databricks.spark.csv').options(header='true').save("/user/user_name/file_name") 因此在技术上,如果有多个分区,我们默认使用单个 reducer 处理此数据帧。然后你会在你的 hdfs 位置获得一个 CSV。

1
然而,这会将csv写成一个“文件夹”,实际的CSV文件里面有一个非常奇怪的名称。 - GenDemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接