【问题标题】:pyspark: Valid strings to pass to dataType arg of cast()pyspark:传递给 cast() 的 dataType arg 的有效字符串
【发布时间】:2019-07-05 16:53:41
【问题描述】:

我将此作为评论发布在this semi-related question,但我觉得它需要一个自己的帖子。

有谁知道在哪里可以找到要传递给cast()dataType 参数的有效字符串列表?我已经查看并找到了诸如 thisthis 之类的东西,但它们都没有明确回答这个问题。

此外,我通过反复试验发现,您可以传递 biginttinyint 之类的内容,这些内容似乎可以工作,尽管它们没有被列为有效的 Spark 数据类型,至少不是我可以找到。有什么想法吗?

对于一些可重复性:

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'。我敢肯定还有其他类似的转换。

另外,我有一种奇怪的感觉,它会默默地忽略你传递的无效字符串,但 不是 真的。当我尝试在 fielddef 字典中传递 'attr': 'varchar' 时,我收到了 DataType varchar is not supported... 错误。

非常感谢任何帮助!

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    这有点棘手,因为 Spark 支持任意复杂的复杂类型(映射、数组、结构)以及用户定义的类型。出于实际目的,DataTypeParserSuite.scala 有一组非常全面的基本类型和复杂类型的示例。

    对于原始类型,我从AstBuilder.scalavisitPrimitiveDataType 方法改编了这个列表

    • “布尔”-> 布尔类型
    • "tinyint" | “字节” -> 字节类型
    • "smallint" | “短” -> 短类型
    • “整数”| “整数” -> 整数类型
    • “大整数”| "long" -> LongType
    • "float" -> FloatType
    • “双”-> 双类型
    • “日期”-> 日期类型
    • “时间戳” -> 时间戳类型
    • “字符串”| “字符(x)” | “varchar(x)” -> 字符串类型
    • “二进制”-> BinaryType
    • “十进制”| "十进制(x)" | “十进制(x.y)” -> 十进制类型

    复杂类型是它们自身和原始类型的组合,例如struct<col1 : timestamp, col2 : bigint, col3 : map<string,array<double>>>

    【讨论】:

    • 很好的答案!这解释了为什么它没有明确记录,尽管文档中的不完整列表很有帮助。谁说“唯一真正的文档是代码本身?”再次感谢您的帮助!
    猜你喜欢
    • 2021-10-28
    • 2013-06-07
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2011-12-31
    • 2019-12-30
    相关资源
    最近更新 更多