Apache spark Spark:根据另一列的值动态引用该列
我有一个包含许多字段的数据集,其中一个字段“valuefieldname”是a引用/指针列,其中包含应处理字段的字段名。如何根据“valuefieldname”列动态获取该列值 我需要类似于下面代码的东西(这不起作用)Apache spark Spark:根据另一列的值动态引用该列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个包含许多字段的数据集,其中一个字段“valuefieldname”是a引用/指针列,其中包含应处理字段的字段名。如何根据“valuefieldname”列动态获取该列值 我需要类似于下面代码的东西(这不起作用) 在Spark计划中,无法直接动态引用列。因此,动态访问必须通过作为计划一部分的数据结构或通过多个计划进行。这导致了解决问题的三种策略: 使用自定义项动态寻址行中的字段。这是最普遍和最简单的方法。当列不太多和/或数据稀疏时,它的效果最好 构建一个MapType列并引用它。在某些情况
在Spark计划中,无法直接动态引用列。因此,动态访问必须通过作为计划一部分的数据结构或通过多个计划进行。这导致了解决问题的三种策略:
行中的字段。这是最普遍和最简单的方法。当列不太多和/或数据稀疏时,它的效果最好
MapType
列并引用它。在某些情况下,这可能比(1)更有效+--------+---------+
|col_name|col_value|
+--------+---------+
| x| 1|
| x| 2|
| y| 30|
+--------+---------+
添加示例输入和预期输出对每一行都有帮助,“valuefieldname”的内容会有所不同吗?或者在所有列中都有一个文本值,就像所有行中都有一个文本值一样。
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|
+--------+---------+