检索spark数据框数组列值,并将其作为UDF中的列名重用

我正在尝试从一列获取列名,并将其作为参数传递给udf。例如 我有一个DataFrame:

 | name   | array_column       | column4 | column5 |
 |--------|--------------------|---------|---------|
 | first  | column4,column5    |   V1    |    V2   |
 | test   | column4,column5    |   V1    |    V2   |
 | choose | column3,column5    |   V1    |    V2   |

df.withcolumn("test",udf(array_column(0),arraycolumn(1)))

其中array_column(0)array_column(1)的{​​{1}}和column4分别代表数据框中的2个列名。

我想基本上做udf(column4,column5),但我需要获取array_column值并将其作为我的udf的参数传递

我尝试设置它,但是由于某些原因该列未正确调用。它被称为column5而不是数组的元素

worinima1 回答:检索spark数据框数组列值,并将其作为UDF中的列名重用

您可以尝试以下代码:

首先创建2个案例类来操纵您的数据框:

case class ResultArray(metric1: Double,metric2: Double,metric3: Double,metric4: Double,metricName: String,opportunityMetricsCol: Array[String])

case class ExpectedResult(value: String)

然后,您可以提取预期的列,如下所示:

val resultArray = Seq(ResultArray(0.55,0.66012,164.8204,4.5,"MetricCalc1",Array("metric1","metric2")),ResultArray(0.55,Array("metric3","metric4")))

+-------+-------+--------+-------+-----------+---------------------+
|metric1|metric2|metric3 |metric4|metricName |opportunityMetricsCol|
+-------+-------+--------+-------+-----------+---------------------+
|0.55   |0.66012|164.8204|4.5    |MetricCalc1|[metric1,metric2]   |
|0.55   |0.66012|164.8204|4.5    |MetricCalc1|[metric3,metric4]   |
+-------+-------+--------+-------+-----------+---------------------+

    val resultArrayDF = resultArray.toDF

    val expectedResult: Dataset[ExpectedResult] = resultArrayDF.map{ value =>
      val opportunityMetricsCol: util.List[String] = value.getList(5)

      ExpectedResult(opportunityMetricsCol.get(0))

    }

    resultArrayDF.select(expectedResult.first().value).show(false)

    expectedResult.show(false)

+-------+
|metric1|
+-------+
|0.55   |
|0.55   |
+-------+

希望这会有所帮助

本文链接:https://www.f2er.com/3137823.html

大家都在问