我是刚开始使用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/

10-13 01:12