Spark-如何从flatMap创建具有选择性字段的map



我在flatMap中有8个字段(field1,field2,…,field8),我想在运行时创建一个映射对象。我想创建一个具有动态键和值元素的映射。

例如,我有像field1、field2、field3这样的关键元素和像field6、field7这样的值元素。下面的片段非常好用。

val myMap = myFlatMap.map(line1 => line1 match {
      case (field1,field2,field3,field4,field5,field6,field7,field8) => {
        ((field1,field2,field3) -> ( field6, field7))
      }

但是,键和值元素是动态获取的(就像命令行参数一样)。如果我在数据结构中有关键元素,比如String或Seq()的数组,我该如何进行类似的映射

输入:例如,myFlatMap具有以下数据:(field1_row1、field2_row1、field3_row1、field 4_row1、ield 5_row1、菲尔德6_row1、字段7\ow1、字段8_row1)(field1_row2、field2_row2、field3_row2、field 4_row2、ield 5_row2、菲尔德6_row2、字段7\ow2、字段8_row2)(field1_row3、field2_row3、field3_row3、field 4_row3、ield 5_row3、菲尔德6_row3、字段7\ow3、字段8_row3)

输出:键和值对的映射,如下所示。

(field1_row1,field2_row1,field 3_row1)->(field6_row1,field7\row1)(field1_row2,field2_row2,field 3_row2)->(field6_row2,field7\row2)(field1_row3,field2_row3,field 3_row3)->(field6_row3,field7\row3)

在上面的例子中,输出映射的键是(field1,field2,field3),值是(field6,field7)。并非每次运行作业都是如此。

在第二次运行中,我可能只需要映射(field1,field2)->field8,并忽略输入flatMap中的所有其他字段。在第三次运行中,我想用(field2,field4)->(field7,field8)创建输出映射

我有一个变量中的输入字段,keyFields=List("field1","field3","field5")。有没有优雅的方式得到这些字段中的一些?

如有任何帮助,我们将不胜感激。

您应该看看这个问题有没有办法从列表中创建元组(无需代码生成)?

不过我会听从dhg的建议。您应该通过提前了解arity来尝试对应用程序进行编码。

您还可以查看spark-sql和数据帧。您可以按任意数量的键、任意数量的字段进行分组。

最新更新