【问题标题】:Create dummy variables frame pyspark创建虚拟变量框架 pyspark
【发布时间】:2019-01-22 14:54:28
【问题描述】:

我有一个 spark 数据框,例如:

|---------------------|------------------------------|
|       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|
|---------------------|---------|--------|--------------|

提前致谢。

【问题讨论】:

  • 两个问题:1)顺序重要吗? 2) 提前知道模型的最大数量吗?
  • 不,顺序无关紧要。我们也不知道模型的最大数量。但我们可以假设然后删除所有空值的列。 @pault

标签: pyspark apache-spark-sql bigdata


【解决方案1】:

发生这种情况是因为您正在旋转 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|
+-------+-------+-------+-------+---------+-------------+----+

【讨论】:

  • 我收到此错误“ModuleNotFoundError: No module named 'resource'”。是不是spark版本的原因。我正在使用 2.4.0 @HiteshRaval
  • @Tarun 您可能需要导入包,from pyspark.sql import * from pyspark.sql import functions as f 我也在使用相同的 spark 版本 2.4.0 我已经在 AWS EMR - pyspark 控制台上执行了这个代码 sn-p。
  • 太好了,@Tarun,如果发布的答案是相关的并帮助您获得所需的结果,那么请投票并接受答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2018-04-06
  • 2020-01-31
  • 1970-01-01
  • 2017-02-24
  • 2012-09-27
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多