Apache Spark 如果列不存在,则为structtype列设置空值

x33g5p2x  于 2023-06-06  发布在  Apache
关注(0)|答案(1)|浏览(140)

我正在处理一个具有嵌套结构类型列的数据框。正在从包含N个文件的文件夹中获取数据。但这些嵌套列可能不会出现在所有这些文件中。我想以这样一种方式创建数据框,它包括所有列,如果列不存在,则设置空值。我尝试使用下面的代码:

df = df.withColumn('fields_acceptance_criteria', 
          F.when(df.schema.simpleString().find("fields_acceptance_criteria$394") == -1, lit("null")) \
          .otherwise(col("fields.acceptance_criteria$394")))

但这会导致TypeError:
条件应为列
有人可以建议我一些方法,我如何才能实现它。

5m1hhzi4

5m1hhzi41#

这就是我们在Spark DataFrames上使用**的方式:

val dfWithNewCol = df
  .withColumn("new_col", when(col("colA") === "X","valueX")
  .when(col("colB") === "Y","valueY")
  .otherwise("Unknown"))

你应该比较列。在你的情况下你比较
df.schema.simpleString().find("fields_acceptance_criteria$394") == -1
它不遵守条件(col(A)== X)
编辑:另一种方法
它可以避免使用时,否则使用过滤器代替。这里有一个例子,你可以从中得到启发,以获得解决方案。当然,在过滤器中,你可以使用行验证的方法。

val data    = Seq((1.0, 2.0, 3.0, 4.0, 3.0), (6.0, 7.0, 8.0, 1.0, 2.0), (2.0, 4.0, 6.0, 8.0, 5.0))
val columns = List("col1", "col2", "col3", "col4", "col5")
val df      = sparkSession.createDataFrame(data).toDF(columns: _*)
df.show()
+----+----+----+----+----+
|col1|col2|col3|col4|col5|
+----+----+----+----+----+
| 1.0| 2.0| 3.0| 4.0| 3.0|
| 6.0| 7.0| 8.0| 1.0| 2.0|
| 2.0| 4.0| 6.0| 8.0| 5.0|
+----+----+----+----+----+

我们将添加一个名为newCol的新列,它包含两个不同的值OK(当一行包含1.0时)和KO(当一行不包含1.0时)
为了做到这一点,我们将创建两个dataframe应用过滤器

val df1 = df.filter(row => row.toString().contains("1.0")).withColumn("newCol", lit("OK"))
df1.show()
+----+----+----+----+----+------+
|col1|col2|col3|col4|col5|newCol|
+----+----+----+----+----+------+
| 1.0| 2.0| 3.0| 4.0| 3.0|    OK|
| 6.0| 7.0| 8.0| 1.0| 2.0|    OK|
+----+----+----+----+----+------+
val df2 = df.filter(row => !row.toString().contains("1.0")).withColumn("newCol", lit("KO"))
df2.show()
+----+----+----+----+----+------+
|col1|col2|col3|col4|col5|newCol|
+----+----+----+----+----+------+
| 2.0| 4.0| 6.0| 8.0| 5.0|    KO|
+----+----+----+----+----+------+

现在我们将应用union来生成结果:

df1.union(df2).show()
+----+----+----+----+----+------+
|col1|col2|col3|col4|col5|newCol|
+----+----+----+----+----+------+
| 1.0| 2.0| 3.0| 4.0| 3.0|    OK|
| 6.0| 7.0| 8.0| 1.0| 2.0|    OK|
| 2.0| 4.0| 6.0| 8.0| 5.0|    KO|
+----+----+----+----+----+------+

相关问题