如何在向现有数据框添加新列的同时指定其数据类型?

时间:2018-08-29 19:04:53

标签: scala apache-spark

我有一个数据帧:yearDF是通过读取Postgres上的RDBMS表获得的,我需要将其提取到HDFS的Hive表中。

  val yearDF = spark.read.format("jdbc").option("url", connectionUrl)
                         .option("dbtable", s"(${execQuery}) as year2017")
                         .option("user", devUserName)
                         .option("password", devPassword)
                         .option("numPartitions",10)
                         .load()

在摄取它之前,我必须为其添加一个新列:delete_flag,其数据类型为:IntegerType。此列用于标记主键是否在源表中删除该行。 要将新列添加到现有数据框,我知道可以使用以下选项:dataFrame.withColumn("del_flag",someoperation),但是没有这样的选项可以指定新列的数据类型。

我将新列的StructType编写为:

val delFlagColumn = StructType(List(StructField("delete_flag", IntegerType, true)))

但是我不明白如何用现有的dataFrame:yearDF添加此列。谁能让我知道如何向现有dataFrame中添加新列及其数据类型?

1 个答案:

答案 0 :(得分:0)

def try_to_int(obj):
    try:
        return str(int(float(obj)))
    except (ValueError, TypeError):
        return obj

如果您要传递lit(1),则不需要强制转换,因为spark会为您推断出架构。但是,如果您以lit(“ 1”)的身份传递,则会将其强制转换为Int