Scala 使用Spark选择特定列

Scala 使用Spark选择特定列,scala,hadoop,apache-spark,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) va

我在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
BIN
TEST 
现在我的数据是:

\
T
I
,
1
N
\
T
I
,
1
N
\
T
I
我希望我的结果是:

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
BIN
TEST 
我不知道我做错了什么。请帮助使用“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

您正在将
|
替换为
,但您没有用逗号拆分,因此
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)

在spark 2.0中,现在您有了csv阅读器,因此您可以按如下方式简单加载csv

val baseDS=spark.read.option("header","true").csv(filePath)
  baseDS.show()
val selectCol = baseDS.select(ColumnName)
您可以按以下方式简单地选择列的名称

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

谢谢这解决了我的问题。我有两个疑问,我想知道何时在scala中使用split(),以及如何提取多个列,例如;如果我想将BIN 2019作为我的结果,我可以使用val keys=word.map(a=>a(5)(6).trim)吗?你可以在这里阅读关于
split
;要获得以空格分隔的两列,您可以使用字符串插值:
word.map(a=>s“${a(5)}${a(6)}”)
。非常感谢您的帮助。如果我想提取多个列,如我想要的BIN 2019作为我的结果,我该如何实现?@Captcha:s.split(\\\\\\\;)返回一个数组。如果你需要类似BIN 2019的东西,我会在上面提到的例子中说s.split(\\\\).map(tuple=>(tuple(5),(tuple(6))code@Rakshith我按照你说的做了,现在我得到的结果是(BIN,20121009151949)我如何删除括号“()”@Captcha:因此基本上返回类型是一个元组。因此,如果你说类似val tokenized的话:(String,String)=s.split(\\\\\;)。map(tuple=>(tuple(5),tuple(6))。因此标记化。u 1将返回您BIN并标记化。u 2将返回您2019。如果您希望它们成为字符串,则可以将标记化。\ u 1和标记化连接起来。\ u 2我为什么要投票?请您解释一下,以便我可以更正它