如何从Spark读取和写入DataFrame

时间:2016-11-20 12:38:19

标签: scala csv apache-spark parquet

我需要以CSV或镶木地板格式(作为单个文件)保存DataFrame,然后再次打开它。数据量不会超过60Mb,因此单个文件是合理的解决方案。这个简单的任务给我带来了很多麻烦......这就是我的尝试:

要读取文件是否存在:

df = sqlContext
               .read.parquet("s3n://bucket/myTest.parquet")
               .toDF("key", "value", "date", "qty")

写文件:

df.write.parquet("s3n://bucket/myTest.parquet")

这不起作用,因为:

1)write使用hadoopish文件创建文件夹myTest.parquet,以后我无法使用.read.parquet("s3n://bucket/myTest.parquet")阅读。事实上我并不关心多个hadoopish文件,除非我以后可以轻松地将它们读入DataFrame。有可能吗?

2)我一直在使用我在S3中更新和覆盖的同一文件myTest.parquet。它告诉我该文件无法保存,因为它已经存在。

那么,有人能指出我做读/写循环的正确方法吗?文件格式对我来说无关紧要(csv,parquet,csv,hadoopish文件)unleass我可以进行读写循环。

1 个答案:

答案 0 :(得分:1)

您可以使用saveAsTable("TableName")保存自己的数据框,并使用table("TableName")进行阅读。并且位置可以由spark.sql.warehouse.dir设置。您可以使用mode(SaveMode.Ignore)覆盖文件。您可以在官方文档中read获取更多信息。

在Java中它看起来像这样:

SparkSession spark = ...
spark.conf().set("spark.sql.warehouse.dir", "hdfs://localhost:9000/tables");
Dataset<Row> data = ...
data.write().mode(SaveMode.Overwrite).saveAsTable("TableName");

现在您可以阅读数据:

spark.read().table("TableName");