使用Spark选择特定列

时间:2016-08-03 10:13:35

标签: scala hadoop apache-spark

我在hdfs中有一个逗号(,)分隔的文件,我正在尝试使用scala提取第6列,因为我已经写了下面的代码

object WordCount {
 def main(args: Array[String])
 {
 val textfile = sc.textFile("/user/cloudera/xxx/xxx")
 val word = textfile.filter( x => x.length >  0 ).map(_.replaceAll("\\|",",").trim)
 val keys = word.map(a => a(5))
 keys.saveAsTextFile("/user/cloudera/xxx/Sparktest")
 }
}

但我得到的HDFS结果并非我想要的结果。

以前我的数据是:

MSH|^~\&|RQ|BIN|SMS|BIN|2019||ORU^R01|120330003918|J|2.2
PID|1|xxxxx|xxxx||TEST|Rooney|19761202|M|MR^^M^MR^MD^11|7|0371 HOES LANE^0371

现在我的数据是:

\
T
I
,
1
N
\
T
I
,
1
N
\
T
I

我希望我的结果是:

BIN
TEST 

我不知道我做错了什么。请帮忙

3 个答案:

答案 0 :(得分:2)

您正在将|替换为,,但您不是按逗号分割,因此word仍然具有RDD[String]类型,而不是你所期待的RDD[Array[String]]。然后,a => a(5)将每个字符串视为字符的数组,从而得到您所看到的结果。

不知道为什么你首先用逗号替换管道,你可以:

val word = textfile.filter(x => x.length >  0).map(_.split('|'))
val keys = word.map(a => a(5).trim)

答案 1 :(得分:0)

使用'split()'函数!

val s="MSH|^~\\&|RQ|BIN|SMS|BIN|2019||ORU^R01|120330003918|J|2.2"

// WRONG
s.replaceAll("\\|",",")(5)   
res3: Char = ~

// RIGHT
s.split("\\|")(5) 
res4: String = BIN

答案 2 :(得分:0)

在spark 2.0中你现在有了csv阅读器,所以你可以简单地加载csv,如下所示

val baseDS=spark.read.option("header","true").csv(filePath)
  baseDS.show()

您可以按名称选择列,如下所示

val selectCol = baseDS.select(ColumnName)