我有一个csv文件,其中一列名为id,另一列名为genre,可以包含任意数量的列。
1,Action|Horror|Adventure
2,Action|Adventure
是否可以选择一行,并为每个类型插入另一个数据帧当前ID和流派。
1,Action
1,Horror
1,Adventure
2,Action
2,Adventure
答案 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|
+---+---------+