为什么createDataFrame的推理者不会将此数据作为字符串创建列?

时间:2016-02-15 14:45:13

标签: python apache-spark pyspark apache-spark-sql

以下代码显示了如何构建dataFrame。可以看出,数据帧包括两列。每列都有整数,最后一行有一个字符串。

据我了解,createDataFrame必须分析列的数据类型(因此在行中)。然后,假设一个数据类型可以包含所有行。在这种情况下,我认为列必须是字符串数据类型,因为此类型可以包含数字和字符串。

因此,为什么生成的dataFrame具有long数据类型的列并且字符串无效?

# DataFrame construction:
b = sqlContext.createDataFrame([(1, 2),(2, 3), (3, 3), ('test0', 'test1')], ['pepe', 'pepa'], samplingRatio=1)
b.show()


#+----+----+
#|pepe|pepa|
#+----+----+
#|   1|   2|
#|   2|   3|
#|   3|   3|
#|null|null|
#+----+----+

在@ ccheneson的建议之后,我决定重新运行代码,删除参数samplingRatio,我得到了完全相同的结果。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为从本地数据结构创建DataFrame时完全忽略RDD参数。 It is used only if data is a RDD。否则,数据将转换为Java RDD,不匹配类型的对象将转换为空值。

如果传递inferSchema而不是列表,Spark将应用模式推断并抛出异常,与Scala中的情况相同。这是因为Spark不支持混合类型并且不执行自动转换。

为什么存在RDDs参数?它看起来像是在Python词典中构建的javac上的弃用推理工件。但这只是一个疯狂的猜测。