Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark:根据另一列的值动态引用该列_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark Spark:根据另一列的值动态引用该列

Apache spark Spark:根据另一列的值动态引用该列,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个包含许多字段的数据集,其中一个字段“valuefieldname”是a引用/指针列,其中包含应处理字段的字段名。如何根据“valuefieldname”列动态获取该列值 我需要类似于下面代码的东西(这不起作用) 在Spark计划中,无法直接动态引用列。因此,动态访问必须通过作为计划一部分的数据结构或通过多个计划进行。这导致了解决问题的三种策略: 使用自定义项动态寻址行中的字段。这是最普遍和最简单的方法。当列不太多和/或数据稀疏时,它的效果最好 构建一个MapType列并引用它。在某些情况

我有一个包含许多字段的数据集,其中一个字段“valuefieldname”是a引用/指针列,其中包含应处理字段的字段名。如何根据“valuefieldname”列动态获取该列值

我需要类似于下面代码的东西(这不起作用)


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

  • 使用自定义项动态寻址
    行中的字段。这是最普遍和最简单的方法。当列不太多和/或数据稀疏时,它的效果最好

  • 构建一个
    MapType
    列并引用它。在某些情况下,这可能比(1)更有效

  • 使多个(灯光)通过数据并合并结果。最好在列数较少且每列中的数据“繁重”时使用,例如,深度结构化数据和密集数据

  • 下面是如何做(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|
    +--------+---------+