我是刚开始使用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的语法糖,但该帖子未详细说明内部原因造成的差异。只是想知道是否有人可以友善地解释上述结果的原因。
谢谢!
最佳答案
首先-如果您查看日志,则会看到以下警告:
在那里是有原因的。
对观察到的行为的解释很简单-模式推断逻辑对于本地集合(可以放心地假设我们可以在可忽略的时间内扫描所有记录)和RDD
(在这种假设必定是正确的)上是不同的。
后一种使用_inferSchema
,对数据进行采样以进行推断。如果未提供采样率,则为it uses only the first row。相反,使用本地集合Spark scans all records。
这里带走的信息是阅读警告,而不是依赖于模式推论(这通常是不可靠且昂贵的)。
关于apache-spark - pyspark的toDF()与createDataFrame()的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49728675/