Spark - 如何使用flatMap中的选择性字段创建地图

时间:2015-12-16 00:35:01

标签: scala apache-spark

我在flatMap中有8个字段(field1,field2,...,field8),我想在运行时创建一个map对象。我想创建一个包含动态键和值元素的地图。

例如。我有关键元素,如field1,field2,field3和value元素,如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,field4_row1,field5_row1,field6_row1,field7_row1,field8_row1) (field1_row2,field2_row2,field3_row2,field4_row2,field5_row2,field6_row2,field7_row2,field8_row2) (field1_row3,field2_row3,field3_row3,field4_row3,field5_row3,field6_row3,field7_row3,field8_row3)

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

(field1_row1,field2_row1,field3_row1) - > (field6_row1,field7_row1) (field1_row2,field2_row2,field3_row2) - > (field6_row2,field7_row2) (field1_row3,field2_row3,field3_row3) - > (field6_row3,field7_row3)

在上面的例子中,输出映射的键是(field1,field2,field3),值是(field6,field7)。每次运行都不是这种情况。

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你应该看一下这个问题Is there way to create tuple from list(without codegeneration)?

我会遵循dhg的建议。您应该事先了解arity来尝试编写应用程序代码。

您还可以查看spark sql和dataframes。您将能够按任意数量的键进行分组,任何数量的字段。