填充pyspark中的列

vqlkdk9b  于 2023-10-15  发布在  Spark
关注(0)|答案(1)|浏览(91)

我在pyspark中有一个像下面这样的框架

df = spark.createDataFrame([
    ['red', 1, 'blue',  1]], schema=['orc_color', 'orc_numbr', 'hive_color', 'hive_numbr'])

内容如下

df.show()
+---------+---------+----------+----------+
|orc_color|orc_numbr|hive_color|hive_numbr|
+---------+---------+----------+----------+
|      red|        1|      blue|         1|
+---------+---------+----------+----------+

我想创建如下数据框
预期输出

+-----------+----------+------------+-----------+-----------+
|orc_columns|orc_values|hive_columns|hive_values|     Status|
+-----------+----------+------------+-----------+-----------+
| orc_color |       red|  hive_color|       blue| Un_matched|
| orc_numbr |         1|  hive_numbr|          1|    Matched|   
+-----------+----------+------------+-----------+-----------+

我想在columns中的第一个_之后的子字符串的基础上记录,并比较values列中的数据。
举例来说:

orc_color == hive_color based on substring after first `_` and compare the `values` column and check if matching or not
im9ewurl

im9ewurl1#

1.获取一组不同的前缀

cols = set([c.split('_')[1] for c in df.columns])

#{'color', 'numbr'}

1.为前4列创建堆栈表达式

stackexpr = "stack(2, "
for c in cols:
    stackexpr = stackexpr + f"'orc_{c}', string(orc_{c}), 'hive_{c}', string(hive_{c}),"

stackexpr = stackexpr[:-1] + ") as (orc_columns, orc_values,hive_columns,hive_values)"

#stack(2, 'orc_numbr', string(orc_numbr), 'hive_numbr', string(hive_numbr),
#         'orc_color', string(orc_color), 'hive_color', string(hive_color)) 
#  as (orc_columns, orc_values,hive_columns,hive_values)

1.运行堆栈表达式并比较包含值的两列

df.select(F.expr(stackexpr)) \
    .withColumn('Status', F.when(F.col('orc_values') == F.col('hive_values'), 'Matched')
                .otherwise('Un_matched')) \
    .show()

输出量:

+-----------+----------+------------+-----------+----------+
|orc_columns|orc_values|hive_columns|hive_values|    Status|
+-----------+----------+------------+-----------+----------+
|  orc_numbr|         1|  hive_numbr|          1|   Matched|
|  orc_color|       red|  hive_color|       blue|Un_matched|
+-----------+----------+------------+-----------+----------+

相关问题