IF语句可以正常工作以构建Spark数据帧吗?

时间:2019-05-05 01:19:35

标签: apache-spark pyspark apache-spark-sql

我有以下代码,该代码使用IF语句有条件地构建数据帧。 这样可以正常工作吗?

df = sqlContext.read.option("badRecordsPath", badRecordsPath).json([data_path_1, s3_prefix + "batch_01/2/2019-04-28/15723921/15723921_15.json"])
if "scrape_date" not in df.columns:
    df = df.withColumn("scrape_date", lit(None).cast(StringType()))

1 个答案:

答案 0 :(得分:0)

这是您要做什么吗?

val result = <SOME Dataframe I previously created>
scala> result.printSchema
root
 |-- VAR1: string (nullable = true)
 |-- VAR2: double (nullable = true)
 |-- VAR3: string (nullable = true)
 |-- VAR4: string (nullable = true)

scala> result.columns.contains("VAR3")
res13: Boolean = true

scala> result.columns.contains("VAR9")
res14: Boolean = false

因此,“结果”数据帧具有列“ VAR1”,“ VAR2”,依此类推。 下一行显示它包含“ VAR3”(表达式的结果为“ true”。但是不包含名为“ VAR9”的列(表达式的结果为“ false”)。

以上是scala,但是您应该能够在Python中执行相同的操作(对不起,我回答时我没有注意到您在询问有关python的信息)。

在执行方面,if语句将在驱动程序节点上本地执行。根据经验,如果返回RDD,DataFrame或DataSet,则将在执行程序上并行执行。由于DataFrame.columns返回一个Array,因此将在驱动程序节点中完成对列列表的任何处理(因为Array不是RDD,DataFrame或DataSet)。

还请注意,RDD,DataFrame和DataSet将“懒惰地”执行。也就是说,Spark将“累积”生成这些对象的操作。仅当您执行不生成RDD,DataFrame或DataSet的操作时,它才会执行它们。例如,当您进行表演或计数或收集时。这样做的部分原因是,Spark可以优化流程的执行。另一个是这样,它只执行生成答案所需的实际操作。