Spark在读取数据帧时会创建一个额外的列

时间:2018-03-17 14:10:40

标签: scala apache-spark apache-spark-sql

我正在将一个JSON文件读入Spark Dataframe,并在最后创建一个额外的列。

var df : DataFrame = Seq(
  (1.0, "a"),
  (0.0, "b"),
  (0.0, "c"),
  (1.0, "d")
).toDF("col1", "col2")

df.write.mode(SaveMode.Overwrite).format("json").save("/home/neelesh/year=2018/")

val newDF = sqlContext.read.json("/home/neelesh/year=2018/*")
newDF.show

newDF.show的输出是:

+----+----+----+
|col1|col2|year|
+----+----+----+
| 1.0|   a|2018|
| 0.0|   b|2018|
| 0.0|   c|2018|
| 1.0|   d|2018|
+----+----+----+

但是JSON文件存储为:

{"col1":1.0,"col2":"a"}
{"col1":0.0,"col2":"b"}
{"col1":0.0,"col2":"c"}
{"col1":1.0,"col2":"d"}

如果从路径中删除year = 2018,则不会添加额外列。这可能是什么问题? 我正在使用Scala 2.10.5运行Spark 1.6.2

2 个答案:

答案 0 :(得分:1)

Spark使用目录结构field = value作为分区信息,请参阅https://spark.apache.org/docs/2.1.0/sql-programming-guide.html#partition-discovery

所以在你的情况下,年份= 2018被认为是年份分区,因此是一个额外的列

答案 1 :(得分:1)

你可以尝试一下:

val newDF = sqlContext.read.json("/home/neelesh/year=2018")
newDF.show

+----+----+
|col1|col2|
+----+----+
| 1.0|   A|
| 0.0|   B|
| 0.0|   C|
| 1.0|   D|
+----+----+

引自spark 1.6

  

从Spark 1.6.0开始,分区发现仅查找分区   默认情况下在给定路径下。对于上面的示例,如果用户通过   path / to / table / gender = male到SQLContext.read.parquet或   SQLContext.read.load,不会将性别视为分区   柱