我有一個 spark 資料框,其中包含企業的 2 列聯系電話,但是我的一些企業重復使用不同的聯系資訊,例如:
| 姓名: | 電話: |
|---|---|
| 總線1 | 082... |
| 總線1 | 087... |
| 總線2 | 076... |
| 總線3 | 081... |
| 總線3 | 084... |
| 總線3 | 086... |
我想要 3 條線路,每個企業 1 條線路,每個企業都有不同的電話號碼,例如:
| 姓名: | 電話1: | 電話2: | 電話3: |
|---|---|---|---|
| 總線1 | 082... | 087... | |
| 總線2 | 076... | ||
| 總線3 | 081... | 084... | 086... |
我曾嘗試使用 select('Name','Phone').distinct(),但我不知道如何將其轉換為與 'Name' 列匹配的單行...請幫助
uj5u.com熱心網友回復:
phone首先基于構造陣列name,然后將陣列拆分為多列。
df = df.groupBy('Name').agg(F.collect_list('Phone').alias('Phone'))
df = df.select('Name', *[F.col('Phone')[i].alias(f'Phone{str(i 1)}') for i in range(3)])
df.show(truncate=False)
uj5u.com熱心網友回復:
嘗試如下 -
輸入資料框
df = spark.createDataFrame([('bus1', '082...'), ('bus1', '087...'), ('bus2', '076...'), ('bus3', '081...'),('bus3', '084...'),('bus3', '086...')], schema=["Name", "Phone"])
df.show()
---- ------
|Name| Phone|
---- ------
|bus1|082...|
|bus1|087...|
|bus2|076...|
|bus3|081...|
|bus3|084...|
|bus3|086...|
---- ------
使用將所有值收集Phone到陣列中collect_list
from pyspark.sql.functions import *
from pyspark.sql.types import *
df1 = df.groupBy("Name").agg(collect_list(col("Phone")).alias("Phone")).select( "Name", "Phone")
df1.show(truncate=False)
---- ------------------------
|Name|Phone |
---- ------------------------
|bus1|[082..., 087...] |
|bus2|[076...] |
|bus3|[081..., 084..., 086...]|
---- ------------------------
拆分Phone為多個列
df1.select(['Name'] [df1.Phone[x].alias(f"Phone{x 1}") for x in range(0,3)]).show(truncate=False)
---- ------ ------ ------
|Name|Phone1|Phone2|Phone3|
---- ------ ------ ------
|bus1|082...|087...|null |
|bus2|076...|null |null |
|bus3|081...|084...|086...|
---- ------ ------ ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448522.html
