2016-02-20 34 views
-2

我正在做一些数据预处理。每条线具有以下架构如何动态构建RDD或DataFrame?

<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

这太宽泛了,无法在这里回答。另外,你到目前为止尝试过什么? – eliasah

+0

我更新了我的帖子,至今为止我做了 –

回答

2

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

我会建议通过文件并行化,然后逐行解析。

对于解析我想:

  1. 创建一个案例类的,你要对行看起来像
  2. 创建(这将允许该架构以创建DF时使用反射来推断)什么(“属性”,正则表达式)
  3. 在正则表达式列表中映射并转换为映射:(Attribute - > Option [Value])
  4. 创建案例类对象
  5. This应该导致List [CaseClass]或RDD [CaseClass]的数据结构可以转换为数据帧。您可能需要执行额外的处理来过滤掉不需要的行并删除选项。
+0

谢谢,没有数据存储在一个文件中。但是你可以向我展示这些步骤的一些示例代码,因为我对spark和scala都是新手。 –

+0

你能看看我做了什么,并告诉我我做错了什么吗? –