pyspark:传递给cast()的dataType arg的有效字符串

时间:2019-07-05 16:53:41

标签: apache-spark pyspark

我在this semi-related question中将其发布为评论,但我认为它需要自己的帖子。

有人知道您在哪里可以找到要传递给dataType的{​​{1}}参数的有效字符串的列表吗?我看过后发现thisthis之类的东西,但没有一个人明确回答这个问题。

此外,通过反复试验,我发现您可以传递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错误。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

这肯定很难回答,因为Spark支持任意复杂度的复杂类型(映射,数组,结构)以及用户定义的类型。出于实际目的,DataTypeParserSuite.scala提供了一组非常完整的原始类型和复杂类型的示例。

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

  • “布尔值”-> BooleanType
  • “ tinyint” | “字节”-> ByteType
  • “ smallint” | “ short”-> ShortType
  • “ int” | “整数”-> IntegerType
  • “ bigint” | “ long”-> LongType
  • “浮动”-> FloatType
  • “ double”-> DoubleType
  • “日期”-> DateType
  • “时间戳”-> TimestampType
  • “字符串” | “ char(x)” | “ varchar(x)”-> StringType
  • “ binary”-> BinaryType
  • “十进制” | “十进制(x)” | “ decimal(x.y)”-> DecimalType
那么

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