只是为了说明问题,我采用了一个测试集 csv 文件。但在实际情况下,问题必须处理的不仅仅是一个 TeraByte 数据。
我有一个 CSV 文件,其中的列用引号(“col1”)括起来。但是当数据导入完成时。一列包含换行符 (\n)。这导致我遇到很多问题,当我想将它们保存为 Hive 表时。
我的想法是用“|”替换\n字符 管火花。
到目前为止我实现了:
1. val test = sqlContext.load(
"com.databricks.spark.csv",
Map("path" -> "test_set.csv", "header" -> "true", "inferSchema" -> "true", "delimiter" -> "," , "quote" -> "\"", "escape" -> "\\" ,"parserLib" -> "univocity" ))#read a csv file
2. val dataframe = test.toDF() #convert to dataframe
3. dataframe.foreach(println) #print
4. dataframe.map(row => {
val row4 = row.getAs[String](4)
val make = row4.replaceAll("[\r\n]", "|")
(make)
}).collect().foreach(println) #replace not working for me
Run Code Online (Sandbox Code Playgroud)
样本集:
(17 , …Run Code Online (Sandbox Code Playgroud) 我是R背景的Spark和Scala的新手,在对RDD进行了一些转换之后,我得到了RDD类型
Description: RDD[(String, Int)]
Run Code Online (Sandbox Code Playgroud)
现在,我想在字符串RDD上应用正则表达式,并从字符串中提取子字符串,然后仅在新列中添加子字符串。
输入数据 :
BMW 1er Model,278
MINI Cooper Model,248
Run Code Online (Sandbox Code Playgroud)
我正在寻找的输出:
Input | Brand | Series
BMW 1er Model,278, BMW , 1er
MINI Cooper Model ,248 MINI , Cooper
Run Code Online (Sandbox Code Playgroud)
其中Brand和Series是来自字符串RDD的新计算的子字符串
到目前为止我所做的。
我可以使用正则表达式为String实现此功能,但是我可以将其应用于所有行。
val brandRegEx = """^.*[Bb][Mm][Ww]+|.[Mm][Ii][Nn][Ii]+.*$""".r //to look for BMW or MINI
Run Code Online (Sandbox Code Playgroud)
那我可以用
brandRegEx.findFirstIn("hello this mini is bmW testing")
Run Code Online (Sandbox Code Playgroud)
但是,如何将它用于RDD的所有行并应用不同的正则表达式来实现上述输出。
我阅读了有关此代码段的信息,但不确定如何将其完全放在一起。
val brandRegEx = """^.*[Bb][Mm][Ww]+|.[Mm][Ii][Nn][Ii]+.*$""".r
def getBrand(Col4: String) : String = Col4 match {
case brandRegEx(str) =>
case _ => ""
return 'substring
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激 !
谢谢