如何动态构建RDD或DataFrame?

时间:2016-02-20 20:27:53

标签: scala apache-spark

我正在对一堆数据进行一些预处理。每行都有以下架构

<row Att1="...." Att2="..."  Attn"...." />

但并非所有行都存在所有属性。也就是说,有些行可能只有三个属性,而另一些有五个等等。此外,没有办法表示每行中有多少属性。

我想形成一个RDD或DataFrame(prefrable)并对数据运行一些查询。但是,我无法找到分割每一行的好方法。例如,按空间拆分不起作用。我在处理过程中只需要一些属性。我尝试使用模式匹配来提取存在于所有行中的4个属性,如下所示,但它失败了。

val pattern = "Att1=(.*) Att3=(.*) Att10=(.*) Att11=(.*)".r
val rdd1 = sc.textFile("file.xml")

val rdd2 = rdd1.map {line => line match {
    case pattern(att1,att2,att3,att4) => Post(att1,att2,att3,att4)
  }
}

case class Post(Att1: String, Att3: String, Att10: String, Att11: String)

P.S。我使用scala。

1 个答案:

答案 0 :(得分:2)

这不是一个火花问题,而是一个scala问题。数据是存储在多个文件中的吗?

我建议按文件进行并行化,然后逐行解析。

对于解析我会:

  1. 创建一个你希望行看起来像的案例类(这将允许在创建DF时使用反射来推断架构)
  2. 为解析创建名称/正则表达式元组列表,如:(“属性”,正则表达式)
  3. 映射正则表达式列表并转换为地图:(属性 - &gt;选项[值])
  4. 创建案例类对象
  5. 这应该导致List [CaseClass]或RDD [CaseClass]的数据结构,可以将其转换为数据帧。您可能需要执行其他处理以过滤掉不需要的行并删除选项。