我是刚刚开始使用spark的初学者。我在pySpark(Scala 2.11.8)
中执行了以下查询dic = [{"a":1},{"b":2},{"c":3}]
spark.parallelize(dic).toDF()
df.show()
然后产生:
+----+
| a|
+----+
| 1|
|null|
|null|
+----+
当我执行spark.createDataFrame(dic).show()
时,它会生成
+----+----+----+
| a| b| c|
+----+----+----+
| 1|null|null|
|null| 2|null|
|null|null| 3|
+----+----+----+
基于 Unable to use rdd.toDF() but spark.createDataFrame(rdd) Works似乎toDF()是createDataFrame的语法糖,但帖子没有详细说明内部会发生什么导致差异。只是想知道是否有人能够解释上述结果背后的原因。
谢谢!
答案 0 :(得分:2)
首先 - 如果您查看日志,您会看到以下警告:
UserWarning:不推荐使用dict推断架构,请改用pyspark.sql.Row warnings.warn("不推荐使用dict推断架构,
正是出于这个原因。
对观察到的行为的解释很简单 - 模式推理逻辑对于本地集合是不同的(我们可以安全地假设我们可以在可忽略的时间内扫描所有记录)和RDD
(这个假设必然是真的) )。
后者使用_inferSchema
,它会对数据进行采样以进行推理。如果未提供采样率,it uses only the first row。相反,使用本地集合Spark scans all records。
这里的消息是阅读警告,而不是依赖于模式推断(这通常是不可靠和昂贵的)。