Pyspark将多值列提取到另一个表中

时间:2017-03-27 05:59:48

标签: python-2.7 apache-spark pyspark

我有一个csv文件,其中一列名为id,另一列名为genre,可以包含任意数量的列。

1,Action|Horror|Adventure
2,Action|Adventure

是否可以选择一行,并为每个类型插入另一个数据帧当前ID和流派。

1,Action
1,Horror
1,Adventure
2,Action
2,Adventure

2 个答案:

答案 0 :(得分:1)

您可以使用udf分割流派数据并使用爆炸功能。

  // regex to catch email
  var regExp = new RegExp("[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}", "gi");

  var emailArray = Array("foo + bar tes+T@gmail.com", "some + text test2A@gms.com", "another + text test3+d@dddd.com", "text + text testtest4@ggg.com");
  for (var h = 0; h < emailArray.length; h++){
    Logger.log("The value was: " + emailArray[h]);
    var match = regExp.exec(emailArray[h]);
    Logger.log("I found: " + match);
  }

答案 1 :(得分:0)

除了Suresh解决方案之外,您还可以在分割字符串后使用flatMap来实现相同的目标:

#Read csv from file (works in Spark 2.x and onwards 
df_csv = sqlContext.read.csv("genre.csv")

#Split the Genre (y) on the character |, but leave the id (x) as is
rdd_split= df_csv.rdd.map(lambda (x,y):(x,y.split('|')))

#Use a list comprehension to add the id column to each Genre(y)
rdd_explode = rdd_split.flatMap(lambda (x,y):[(x,k) for k in y])

#Convert the resulting RDD back to a dataframe
df_final = rdd_explode.toDF(['id','Genre'])

df_final.show()将此作为输出返回:

+---+---------+
| id|    Genre|
+---+---------+
|  1|   Action|
|  1|   Horror|
|  1|Adventure|
|  2|   Action|
|  2|Adventure|
+---+---------+