spark scala中的数据帧映射?

Data Frame Mapping in spark scala?

我有如下数据集

INo,Sc,Desc,Quan,IDate,UPice,CID,Country
1,2,"H,H",6,12-1-2010 8:26,2.55,c1,United Kingdom
2,3,"WE,RN",6,12-1-2010 8:26,3.39,c2,United Kingdom
3,3,CREAM ,8,12-1-2010 8:26,2.75,c3,United Kingdom
4,4,KLE,6,12-1-2010 8:26,3.39,c4,United Kingdom
5,5,"DI,AMR,ROR, ",2,1-7-2011 13:55,11.02,c5,United Kingdom
6,6,SU"asasa,1,12-9-2010 16:26,11.02,c6,United Kingdom

我已经通过执行以下代码创建了数据框:

case class Rating(CID: String, SC: String, rating: Double)
def parseRating(str: String): Rating = {
val fields = str.split(",")
Rating(fields(6), fields(1), 1.0D)
}
val ratings = spark.read.textFile("C:/Users/test/Desktop/test123.txt").map(parseRating).toDF().dropDuplicates("CID", "SC")
ratings.collect().map(t => println(t))
ratings.show()

我得到如下输出

+---------------+---+------+
|            CID| SC|rating|
+---------------+---+------+
|12-9-2010 16:26|  6|   1.0|
|             c3|  3|   1.0|
|            CID| Sc|   1.0|
|             c4|  4|   1.0|
|           3.39|  3|   1.0|
|              2|  5|   1.0|
|           2.55|  2|   1.0|
+---------------+---+------+

我来到这里是因为 field=str.split(",")。输入数据是 6,6,"SET,CO,SU",1,12-9-2010 16:26,11.02,c6,英国

但我的预期输出是

+---------------+---+------+
|            CID| SC|rating|
+---------------+---+------+
|             c6|  6|   1.0|
|             c3|  3|   1.0|
|             c2|  3|   1.0|
|             c4|  4|   1.0|
|             c5|  5|   1.0|
|             c1|  2|   1.0|
+---------------+---+------+ 

请帮我解决这个问题。

不能直接用“,”分割每条记录。因为一些列值有“,”作为值而不是分隔符。例如第一条记录中的"H,H",

您将需要一个正则表达式来进行如下拆分,

def parseRating(str: String): Rating = {
val fields = str.split("\,(?=([^\"]*\"[^\"]*\")*[^\"]*$)")
Rating(fields(6), fields(1), 1.0D)
}

此外,您的第一行是 header.Read 它在加载数据文件时 header 为真,或者在加载数据文件后过滤第一行。

如果您使用的是 Spark 2,您可以像下面这样操作:

val data = spark.read.option("header", true).csv("test123.txt")
data.select("CID", "Sc").withColumn("rating", lit(1.0)).show
+---+---+------+
|CID| Sc|rating|
+---+---+------+
| c1|  2|   1.0|
| c2|  3|   1.0|
| c3|  3|   1.0|
| c4|  4|   1.0|
| c5|  5|   1.0|
| c6|  6|   1.0|
+---+---+------+