我见过很多人建议Dataframe.explode
是实现此目的的一种有用方法,但是它导致的行数比原始数据帧多,这根本不是我想要的。我只想做非常简单的Dataframe等效项:
rdd.map(lambda row: row + [row.my_str_col.split('-')])
它看起来像:
col1 | my_str_col
-----+-----------
18 | 856-yygrm
201 | 777-psgdg
并将其转换为:
col1 | my_str_col | _col3 | _col4
-----+------------+-------+------
18 | 856-yygrm | 856 | yygrm
201 | 777-psgdg | 777 | psgdg
我知道
pyspark.sql.functions.split()
,但是它导致嵌套的数组列,而不是像我想要的两个顶级列。理想情况下,我也希望这些新列也被命名。
最佳答案
pyspark.sql.functions.split()
是这里的正确方法-您只需要将嵌套的ArrayType列展平为多个顶级列。在这种情况下,每个数组仅包含2个项目,这非常简单。您只需使用Column.getItem()
即可将数组的每个部分作为列本身进行检索:
split_col = pyspark.sql.functions.split(df['my_str_col'], '-')
df = df.withColumn('NAME1', split_col.getItem(0))
df = df.withColumn('NAME2', split_col.getItem(1))
结果将是:
col1 | my_str_col | NAME1 | NAME2
-----+------------+-------+------
18 | 856-yygrm | 856 | yygrm
201 | 777-psgdg | 777 | psgdg
我不确定在嵌套数组在行与行之间大小不相同的一般情况下如何解决此问题。