简单的请求是我需要帮助将列添加到数据帧,但是该列必须为空,其类型来自 ...spark.sql.types 并且必须从字符串定义类型。
我可能可以用 ifs 或 case 来做到这一点,但我正在寻找更优雅的东西。不需要为 org.apache.spark.sql.types 中的每种类型编写案例
例如,如果我这样做:
df = df.withColumn("col_name", lit(null).cast(org.apache.spark.sql.types.StringType))
它按预期工作,但我将类型存储为字符串,
var the_type = "StringType"
或者
var the_type = "org.apache.spark.sql.types.StringType"
我无法通过从字符串定义类型来使其工作。
对于那些感兴趣的人,这里有一些更多细节:我有一个包含元组(col_name,col_type)作为字符串的集合,我需要添加具有正确类型的列,以便将来在两个数据帧之间进行联合。
我目前有这个:
for (i <- set_of_col_type_tuples) yield {
val tip = Class.forName("org.apache.spark.sql.types."+i._2)
df = df.withColumn(i._1, lit(null).cast(the_type))
df }
if I use
val the_type = Class.forName("org.apache.spark.sql.types."+i._2)
I get
error: overloaded method value cast with alternatives: (to: String)org.apache.spark.sql.Column <and> (to: org.apache.spark.sql.types.DataType)org.apache.spark.sql.Column cannot be applied to (Class[?0])
if I use
val the_type = Class.forName("org.apache.spark.sql.types."+i._2).getName()
这是一个字符串,所以我得到:
org.apache.spark.sql.catalyst.parser.ParseException: mismatched input '.' expecting {<EOF>, '('}(line 1, pos 3)
== SQL == org.apache.spark.sql.types.StringType
---^^^
编辑:所以,为了清楚起见,该集合包含这样的元组 ("col1","IntegerType"), ("col2","StringType") 而不是 ("col1","int"), ("col2", “细绳”)。简单的转换(i._2)不起作用。
谢谢。