【问题标题】:Create new Data frame from an existing one in pyspark从 pyspark 中的现有数据框创建新数据框
【发布时间】:2023-01-30 02:09:27
【问题描述】:

我使用 pySpark 从包含搜索查询和用户 ID 的 txt 文件创建了这个数据框。

`spark = SparkSession.builder.getOrCreate()
  
df = spark.read.option("header", "true") \
    .option("delimiter", "\t") \
    .option("inferSchema", "true") \
    .csv("/content/drive/MyDrive/my_data.txt")
    
df.select("AnonID","Query").show()`

它看起来像这样:

+------+--------------------+
|AnonID|               Query|
+------+--------------------+
|   142|      rentdirect.com|
|   142|www.prescriptionf...|
|   142|          staple.com|
|   142|          staple.com|
|   142|www.newyorklawyer...|
|   142|www.newyorklawyer...|
|   142|     westchester.gov|
|   142|       space.comhttp|
|   142|                dfdf|
|   142|                dfdf|
|   142|         vaniqa.comh|
|   142| www.collegeucla.edu|
|   142|          www.elaorg|
|   142|        207 ad2d 530|
|   142|        207 ad2d 530|
|   142|   broadway.vera.org|
|   142|   broadway.vera.org|
|   142|            vera.org|
|   142|   broadway.vera.org|
|   142|    frankmellace.com|
|   142|         ucs.ljx.com|
|   142|   attornyleslie.com|
|   142|merit release app...|
|   142| www.bonsai.wbff.org|
|   142|         loislaw.com|
|   142|           rapny.com|
|   142|      whitepages.com|
|   217|             lottery|
|   217|             lottery|
|   217|      ameriprise.com|
|   217|             susheme|
|   217|          united.com|
|   217|          mizuno.com|
|   217|p; .; p;' p; ' ;'...|
|   217|p; .; p;' p; ' ;'...|
|   217|asiansexygoddess.com|
|   217|            buddylis|
|   217|bestasiancompany.com|
|   217|             lottery|
|   217|             lottery|
|   217|             ask.com|
|   217|         weather.com|
|   217|      wellsfargo.com|
|   217|www.tabiecummings...|
|   217|     wanttickets.com|
|   217|           yahoo.com|
|   217|                   -|
|   217|    www.ngo-quen.org|
|   217|                   -|
|   217|             vietnam|
+------+--------------------+

我想要做的是每个用户 ID 都是一行,每个查询都在一列中。

+------+------------+---------
|ID |   1   |   2   |    3     .......
+------+------------+---------
|142| query1|query2| query3
|217| query1|query2| query3
|993| query1|query2| query3
|1268| query1|query2| query3
|1326| query1|query2| query3
  .
  .        
  .

我尝试借助在 Google 上进行的搜索在行和列之间切换,但没有成功。

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    您可以按 AnonID 对数据框进行分组,然后旋转 Query 列以为每个唯一查询创建新列:

    df = df.groupBy("AnonID").pivot("Query").agg(F.first("Query"))
    

    如果您有很多不同的值,请尝试

    df = df.groupBy("AnonID").agg(F.collect_list("Query").alias("Queries"))
    

    然后,您可以将列重命名为 1、2、3 等。

    df = df.selectExpr("AnonID", *[f"`{i+1}` as `{i+1}`" for i in range(len(df.columns)-1)])
    

    【讨论】:

    • 谢谢你。我已经尝试并收到此错误:“AnalysisException:数据透视列查询有超过 10000 个不同的值,这可能表示错误。如果这是有意的,请将 spark.sql.pivotMaxValues 至少设置为枢轴列。”
    • @AmitBenDavid 编辑了解决方案。也许这有帮助
    • 刚才我看到你的编辑..大“F”是什么?你用的是哪个包?
    猜你喜欢
    • 2021-09-08
    • 2016-10-14
    • 1970-01-01
    • 2022-01-18
    • 2019-05-11
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多