具有来自另一个 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 行左右,我正在考虑如果可能的话广播这个(这将 运行 在集群中)。
有什么想法吗?
尝试使用 crossJoin
和 pivot
函数以获得所需的输出。
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|
#+----------+----+-------+-----------+
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 行左右,我正在考虑如果可能的话广播这个(这将 运行 在集群中)。
有什么想法吗?
尝试使用 crossJoin
和 pivot
函数以获得所需的输出。
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|
#+----------+----+-------+-----------+