创建虚拟变量框架pyspark
我有一个spark数据框,如:创建虚拟变量框架pyspark,pyspark,apache-spark-sql,bigdata,Pyspark,Apache Spark Sql,Bigdata,我有一个spark数据框,如: |---------------------|------------------------------| | Brand | Model | |---------------------|------------------------------| | Hyundai | Elentra,Creta | |-------------
|---------------------|------------------------------|
| Brand | Model |
|---------------------|------------------------------|
| Hyundai | Elentra,Creta |
|---------------------|------------------------------|
| Hyundai | Creta,Grand i10,Verna |
|---------------------|------------------------------|
| Maruti | Eritga,S-cross,Vitara Brezza|
|---------------------|------------------------------|
| Maruti | Celerio,Eritga,Ciaz |
|---------------------|------------------------------|
我想要这样的数据帧:
|---------------------|---------|--------|--------------|--------|---------|
| Brand | Model0 | Model1 | Model2 | Model3 | Model4 |
|---------------------|---------|--------|--------------|--------|---------|
| Hyundai | Elentra | Creta | Grand i10 | Verna | null |
|---------------------|---------|--------|--------------|--------|---------|
| Maruti | Ertiga | S-Cross| Vitara Brezza| Celerio| Ciaz |
|---------------------|---------|--------|--------------|--------|---------|
我使用了以下代码:
schema = StructType([
StructField("Brand", StringType()),StructField("Model", StringType())])
tempCSV = spark.read.csv("PATH\\Cars.csv", sep='|', schema=schema)
tempDF = tempCSV.select(
"Brand",
f.split("Model", ",").alias("Model"),
f.posexplode(f.split("Model", ",")).alias("pos", "val")
)\
.drop("val")\
.select(
"Brand",
f.concat(f.lit("Model"),f.col("pos").cast("string")).alias("name"),
f.expr("Model[pos]").alias("val")
)\
.groupBy("Brand").pivot("name").agg(f.first("val")).toPandas()
但是我没有得到想要的结果。与其给出第二个表的结果,不如给出:
|---------------------|---------|--------|--------------|
| Brand | Model0 | Model1 | Model2 |
|---------------------|---------|--------|--------------|
| Hyundai | Elentra | Creta | Grand i10 |
|---------------------|---------|--------|--------------|
| Maruti | Ertiga | S-Cross| Vitara Brezza|
|---------------------|---------|--------|--------------|
提前感谢。发生这种情况是因为您在同一品牌组中具有重复价值的
pos
上旋转数据。
您可以使用rownumber()
并旋转数据以生成所需的结果
下面是您提供的数据上方的示例代码
df = sqlContext.createDataFrame([('Hyundai',"Elentra,Creta"),("Hyundai","Creta,Grand i10,Verna"),("Maruti","Eritga,S-cross,Vitara Brezza"),("Maruti","Celerio,Eritga,Ciaz")],("Brand","Model"))
tmpDf = df.select("Brand",f.split("Model", ",").alias("Model"),f.posexplode(f.split("Model", ",")).alias("pos", "val"))
tmpDf.createOrReplaceTempView("tbl")
seqDf = sqlContext.sql("select Brand, Model, pos, val, row_number() over(partition by Brand order by pos) as rnk from tbl")
seqDf.groupBy('Brand').pivot('rnk').agg(f.first('val'))
这将产生以下结果
+-------+-------+-------+-------+---------+-------------+----+
| Brand| 1| 2| 3| 4| 5| 6|
+-------+-------+-------+-------+---------+-------------+----+
| Maruti| Eritga|Celerio|S-cross| Eritga|Vitara Brezza|Ciaz|
|Hyundai|Elentra| Creta| Creta|Grand i10| Verna|null|
+-------+-------+-------+-------+---------+-------------+----+
两个问题:1)顺序重要吗?2) 你提前知道最大型号吗?不知道,订单无关紧要。我们也不知道最大型号的数量。但是我们可以假设并删除包含所有空值的列@paultI收到错误“ModuleNotFoundError:没有名为'resource'的模块”。是因为火花版。我正在使用2.4.0@HiteshRaval@Tarun您可能需要从pyspark.sql import*
中导入包,从pyspark.sql导入函数作为f
我也使用相同的spark版本2.4.0,我已经在AWS EMR-pyspark控制台上执行了此代码段。很好,@Tarun如果发布的答案是相关的,并且帮助您获得了想要的结果,那么请投票并接受答案。谢谢