我正在将一个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
答案 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.0开始,分区发现仅查找分区 默认情况下在给定路径下。对于上面的示例,如果用户通过 path / to / table / gender = male到SQLContext.read.parquet或 SQLContext.read.load,不会将性别视为分区 柱