pyspark的todf()与createdataframe()的奇怪行为

h6my8fg2  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(691)

我是一个初学者谁刚刚开始使用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|
+----+----+----+

基于不能使用rdd.todf()但是spark.createdataframe(rdd)可以工作,todf()似乎是createdataframe的语法糖,但是文章没有详细说明内部发生了什么导致了这种差异。只是想知道是否有人能解释一下上述结果背后的原因。
谢谢!

qhhrdooz

qhhrdooz1#

首先-如果您查看日志,您将看到以下警告:
userwarning:不赞成从dict推断架构,请使用pyspark.sql.row代替warnings.warn(“不赞成从dict推断架构,
这是有原因的。
对观察到的行为的解释很简单-模式推理逻辑对于本地收集是不同的(我们可以安全地假设我们可以在可忽略的时间内扫描所有记录),并且 RDD (此假设必然成立)。
后者使用 _inferSchema ,对数据进行采样以进行推断。如果未提供采样率,则仅使用第一行。与此相反,对于本地收集,spark扫描所有记录。
这里的附加信息是读取警告,而不是依赖于模式推断(这通常是不可靠和昂贵的)。

相关问题