首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检索星星之火数据数组列值,并在UDF中将其作为列名重用。

检索星星之火数据数组列值,并在UDF中将其作为列名重用。
EN

Stack Overflow用户
提问于 2019-11-08 04:47:25
回答 1查看 1.1K关注 0票数 2

我试图从一个列中获取列名,并将其作为参数传递给udf。就像。我有一个DataFrame:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 | 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)分别是column4column5,分别表示数据文件中的两个列名。

我想基本地做udf(column4,column5),但我需要获得array_column值,并将它们作为udf的参数传递。

我试着设置它,但是由于某种原因,列没有被正确地调用。它被调用为String,而不是数组的元素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-08 06:14:41

您可以尝试以下代码:

首先,创建两个case类来操作数据文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case class ResultArray(metric1: Double, metric2: Double, metric3: Double, metric4: Double, metricName: String, opportunityMetricsCol: Array[String])

case class ExpectedResult(value: String)

然后,您可以按以下方式提取预期的列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val resultArray = Seq(ResultArray(0.55, 0.66012, 164.8204, 4.5,"MetricCalc1", Array("metric1","metric2")),
      ResultArray(0.55, 0.66012, 164.8204, 4.5,"MetricCalc1", 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   |
+-------+

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58766905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文