我在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
我不知道我做错了什么。请帮忙
答案 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)