将多列转换为具有可变列数的单行
Convert Multiple columns into a single row with a variable amount of columns
我有一个包含企业的 spark 数据框,其联系电话分列在 2 列中,但是我的一些企业重复了不同的联系信息,例如:
Name:
Phone:
bus1
082...
bus1
087...
bus2
076...
bus3
081...
bus3
084...
bus3
086...
我想要 3 行,每行 1 行,每行有不同的 phone 编号,例如:
Name:
Phone1:
Phone2:
Phone3:
bus1
082...
087...
bus2
076...
bus3
081...
084...
086...
我试过使用 select('Name','Phone').distinct(),但我不知道如何将它转换为与 'Name' 专栏...请帮助
首先根据name
构建phone
数组,然后将数组拆分为多列
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)
尝试以下操作 -
输入数据帧
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...|
+----+------+
使用 collect_list
将所有 Phone
值收集到一个数组中
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...|
+----+------+------+------+
我有一个包含企业的 spark 数据框,其联系电话分列在 2 列中,但是我的一些企业重复了不同的联系信息,例如:
Name: | Phone: |
---|---|
bus1 | 082... |
bus1 | 087... |
bus2 | 076... |
bus3 | 081... |
bus3 | 084... |
bus3 | 086... |
我想要 3 行,每行 1 行,每行有不同的 phone 编号,例如:
Name: | Phone1: | Phone2: | Phone3: |
---|---|---|---|
bus1 | 082... | 087... | |
bus2 | 076... | ||
bus3 | 081... | 084... | 086... |
我试过使用 select('Name','Phone').distinct(),但我不知道如何将它转换为与 'Name' 专栏...请帮助
首先根据name
构建phone
数组,然后将数组拆分为多列
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)
尝试以下操作 -
输入数据帧
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...|
+----+------+
使用 collect_list
Phone
值收集到一个数组中
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...|
+----+------+------+------+