使用Scala处理csv文件中字段内的分隔符

时间:2017-06-24 06:39:16

标签: scala csv apache-spark delimiter

我的.csv文件包含|分隔符和以下命令适合我,对某些包含艺术家名称内的分隔符的记录执行

val df_artist = spark.read.format("com.databricks.spark.csv").option("header", "false").option("delimiter", "|").option("mode", "DROPMALFORMED").load("./artists.csv");

普通:

ARVYNKF1272BA83168|TRAGGZG128F92F9B5E|Black Devil Disco Club

不规则:

ARQJXPL1187B9B4D6B|TRWUJAE128F92E3E7D|M|A|R|R|S
ARZCIDG1187B992CE3||Kid Creole | The Coconuts

是否可以将前两列和剩下的所有内容放到第三列,忽略分隔符?

我使用Spark 2.1.1,如果它很重要。

1 个答案:

答案 0 :(得分:0)

我建议使用sparkContext textFile来阅读csv文件,并split使用|分隔线,并选择前两个字符串作为前两个列和其余列为第三列。这个的工作代码是

val data = sc.textFile("./artists.csv")
data.map(line => line.split("\\|"))
  .map(array => (array(0), array(1), array.drop(2)))
  .toDF("rowId", "ticketId", "movies")
  .show(false)

给定,输入文件包含数据

ARVYNKF1272BA83168|TRAGGZG128F92F9B5E|Black Devil Disco Club
ARQJXPL1187B9B4D6B|TRWUJAE128F92E3E7D|M|A|R|R|S
ARZCIDG1187B992CE3||Kid Creole | The Coconuts

上述代码的输出将是

+------------------+------------------+----------------------------+
|rowId             |ticketId          |movies                      |
+------------------+------------------+----------------------------+
|ARVYNKF1272BA83168|TRAGGZG128F92F9B5E|[Black Devil Disco Club]    |
|ARQJXPL1187B9B4D6B|TRWUJAE128F92E3E7D|[M, A, R, R, S]             |
|ARZCIDG1187B992CE3|                  |[Kid Creole ,  The Coconuts]|
+------------------+------------------+----------------------------+