我在this semi-related question中将其发布为评论,但我认为它需要自己的帖子。
有人知道您在哪里可以找到要传递给dataType
的{{1}}参数的有效字符串的列表吗?我看过后发现this或this之类的东西,但没有一个人明确回答这个问题。
此外,通过反复试验,我发现您可以传递cast()
或bigint
之类的东西,尽管它们在任何地方都没有被列为有效的Spark数据类型,但它们似乎仍然有效至少不是我能找到的。有什么想法吗?
对于某些可重复性:
tinyint
这可以给您df = spark.createDataFrame(
[
[18786, "attr1", 0.9743],
[65747, "attr1", 0.4568],
[56465, "attr1", 0.6289],
[18786, "attr2", 0.2976],
[65747, "attr2", 0.4869],
[56465, "attr2", 0.8464],
],
["id", "attr", "val"],
)
print(df)
,我想是默认情况下可以推断出模式。
然后您可以执行以下操作来重新转换类型:
DataFrame[id: bigint, attr: string, val: double]
现在我得到from pyspark.sql.functions import col
fielddef = {'id': 'smallint', 'attr': 'string', 'val': 'long'}
df = df.select([col(c).cast(fielddef[c]) for c in df.columns])
print(df)
,因此显然DataFrame[id: smallint, attr: string, val: bigint]
转换为'long'
。我确定还有其他类似的转换。
此外,我有一种奇怪的感觉,即它只是默默地忽略您传递的无效字符串,但这是不是。当我尝试在'bigint'
字典中传递'attr': 'varchar'
时,出现了fielddef
错误。
非常感谢您的帮助!
答案 0 :(得分:1)
这肯定很难回答,因为Spark支持任意复杂度的复杂类型(映射,数组,结构)以及用户定义的类型。出于实际目的,DataTypeParserSuite.scala提供了一组非常完整的原始类型和复杂类型的示例。
对于原始类型,我从AstBuilder.scala的visitPrimitiveDataType
方法改编了此列表
复合类型就是它们自身和原始类型的组合,例如struct<col1 : timestamp, col2 : bigint, col3 : map<string,array<double>>>