Apache Spark - 解析数据并将列转换为行

时间:2016-12-10 18:46:23

标签: apache-spark

我需要将列转换为行。请帮我解决spark scala code.input文件中的以下要求。分隔符和其中一个具有逗号分隔符值的列。基于逗号分隔符我需要将它们转换为行

我的输入记录:

C11 | C12 | A,B | C14

C21 | C2 2 | A,C,D | C24

预期产出:

一个,C11,C12,C14

B,C11,C12,C14

一个,C21,C22,C24

C,C21,C22,C24

d,C21,C22,C24

谢谢,

希瓦

1 个答案:

答案 0 :(得分:0)

首先使用|将数据帧读取为csv作为分隔符:

这提供了一个数据帧,其中包含您需要的基本列,除了第三个是字符串。假设您将此列重命名为_c2(第三列的默认名称)。现在您可以拆分字符串以获取数组 我们也删除了之前的专栏,因为我们不再需要它了。 最后,我们使用explode将数组转换为行并删除未使用的列

from pyspark.sql.functions import split
from pyspark.sql.functions import explode
df1 = spark.read.csv("pathToFile", sep="|")
df2 = df1.withColumn("splitted", split(df1["_c2"],",")).drop("_c2")
df3 = df2.withColumn("exploded", explode(df2["splitted"])).drop("splitted")

或scala(自由形式)

import org.apache.spark.sql.functions.split
import org.apache.spark.sql.functions.explode
val df1 = spark.read.csv("pathToFile", sep="|")
val df2 = df1.withColumn("splitted", split(df1("_c2"),",")).drop("_c2")
val df3 = df2.withColumn("exploded", explode(df2("splitted"))).drop("splitted")