我是一个初学者谁刚刚开始使用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的语法糖,但是文章没有详细说明内部发生了什么导致了这种差异。只是想知道是否有人能解释一下上述结果背后的原因。
谢谢!
1条答案
按热度按时间qhhrdooz1#
首先-如果您查看日志,您将看到以下警告:
userwarning:不赞成从dict推断架构,请使用pyspark.sql.row代替warnings.warn(“不赞成从dict推断架构,
这是有原因的。
对观察到的行为的解释很简单-模式推理逻辑对于本地收集是不同的(我们可以安全地假设我们可以在可忽略的时间内扫描所有记录),并且
RDD
(此假设必然成立)。后者使用
_inferSchema
,对数据进行采样以进行推断。如果未提供采样率,则仅使用第一行。与此相反,对于本地收集,spark扫描所有记录。这里的附加信息是读取警告,而不是依赖于模式推断(这通常是不可靠和昂贵的)。