具有来自另一个 table 的值的 Pyspark 子字符串

Pyspark substring with values from another table

Pyspark:我有两个数据框。第一个是包含长字符串的一列。第二个数据框是一个查找数据框,其中包含一些指示某些子字符串开始和结束的值。我想使用第二个数据帧来拆分第一个数据帧,并得到一个包含原始数据和字符串拆分值的结果数据帧:

数据框A:

Data
000 456 9b
876 998 1c

数据框 B:

Description Start End Length
City 1 3 3
Country 5 7 3
IheartSpark 9 10 2

结果是这样的:

Data City Country IheartSpark
000 456 9b 000 456 9b
876 998 1c 876 998 1c

Dataframe b 只有 30 行左右,我正在考虑如果可能的话广播这个(这将 运行 在集群中)。

有什么想法吗?

尝试使用 crossJoinpivot 函数以获得所需的输出。

Example:

df.show()
#+----------+
#|      Data|
#+----------+
#|000 456 9b|
#|876 998 1c|
#+----------+

df1.show()
#+-----------+-----+---+------+
#|      Descr|start|end|length|
#+-----------+-----+---+------+
#|       City|    1|  3|     3|
#|    Country|    5|  7|     3|
#|IheartSpark|    9| 10|     2|
#+-----------+-----+---+------+

from pyspark.sql.functions import *

df.crossJoin(broadcast(df1)).\
withColumn("nn",expr("""substring(Data,start,length)""")).\
groupBy("Data").\
pivot("Descr").\
agg(first(col("nn"))).\
show()
#+----------+----+-------+-----------+
#|      Data|City|Country|IheartSpark|
#+----------+----+-------+-----------+
#|000 456 9b| 000|    456|         9b|
#|876 998 1c| 876|    998|         1c|
#+----------+----+-------+-----------+