以下代码显示了如何构建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
,我得到了完全相同的结果。知道为什么会这样吗?
答案 0 :(得分:2)
发生这种情况是因为从本地数据结构创建DataFrame
时完全忽略RDD
参数。 It is used only if data
is a RDD
。否则,数据将转换为Java RDD,不匹配类型的对象将转换为空值。
如果传递inferSchema
而不是列表,Spark将应用模式推断并抛出异常,与Scala中的情况相同。这是因为Spark不支持混合类型并且不执行自动转换。
为什么存在RDDs
参数?它看起来像是在Python词典中构建的javac
上的弃用推理工件。但这只是一个疯狂的猜测。