Spark:根据另一列的值动态参考列



我有一个具有许多字段的数据集和一个字段" valuefieldName"是一个参考/指针列,其中包含应该处理的字段的字段_name。如何根据" ValueFieldName"列动态获取该列值?

我需要类似于以下代码(不起作用的代码)

的东西
val dataSet2 = dataSet1.withColumn("targetoutput", col(col("valuefieldname")))

无法在火花计划中直接引用列。因此,动态访问必须通过计划的一部分或多个计划来进行。这导致了解决问题的三种策略:

  1. 使用UDF在Row中动态地解决字段。这是最普遍,最简单的方法。当列不多和/或数据稀疏时,它最有效。

  2. 构建MapType列并引用它。在某些情况下,这可能比(1)。

  3. 更有效
  4. 使多个(光)通过数据并结合结果。当列数很少时,最好使用,每列中的数据为"重",例如结构化的数据和密集。

这是如何做(1):

def getColumnAs[A](colName: String, row: Row): Option[A] = 
  if (row == null) None
  else {
    val idx = row.fieldIndex(colName)
    if (row.isNullAt(idx)) None else Some(row.getAs[A](idx))
  }
case class Data(col_name: String, x: Option[Int], y: Option[Int])
val df = spark.createDataset(Seq(
  Data("x", Some(1), None), 
  Data("x", Some(2), Some(20)), 
  Data("y", None,    Some(30))
)).toDF
val colValue = udf(getColumnAs[Int] _)
df.select(
    'col_name, 
    colValue('col_name, struct('*)).as("col_value")
  )
  .show

输出为

+--------+---------+
|col_name|col_value|
+--------+---------+
|       x|        1|
|       x|        2|
|       y|       30|
+--------+---------+

相关内容

  • 没有找到相关文章

最新更新