如何使用 sql 从一个字符串列中提取多列
How to extract multiple columns from one string column using sql
我有两列,在费用列中我有不同的费用,例如 post
、neg
、transfer
、drawer
费用
ref_no
charges
001
POSTEX USD 100 B^NEGO USD 200 B^TRAN USD 150
002
POSTEX USD 400 B^TRAN USD 350
003
NEGO USD 700 B^TRAN USD 350
004
DRAW USD 700
现在我想要的是这样的:
ref_no
POSTEX
NEGO
TRAN
DRAW
001
POSTEX USD 100
NEGO USD 200
TRAN USD 150
002
POSTEX USD 400
TRAN USD 350
003
NEGO USD 700
TRAN USD 350
004
DRAW USD 700
我试过使用 lateral view
+ split
但它不起作用,有没有其他方法可以使用 SparkSQL 或 MySql?
在 Spark SQL 中使用 regexp_extract
函数的一种方法:
spark.sql(r"""
SELECT ref_no,
regexp_extract(charges, '(POSTEX USD \d+)', 1) AS POSTEX,
regexp_extract(charges, '(NEGO USD \d+)', 1) AS NEGO,
regexp_extract(charges, '(TRAN USD \d+)', 1) AS TRAN,
regexp_extract(charges, '(DRAW USD \d+)', 1) AS DRAW
FROM my_table
""").show()
#+------+--------------+------------+------------+------------+
#|ref_no| POSTEX| NEGO| TRAN| DRAW|
#+------+--------------+------------+------------+------------+
#| 001|POSTEX USD 100|NEGO USD 200|TRAN USD 150| |
#| 002|POSTEX USD 400| |TRAN USD 350| |
#| 003| |NEGO USD 700|TRAN USD 350| |
#| 004| | | |DRAW USD 700|
#+------+--------------+------------+------------+------------+
我有两列,在费用列中我有不同的费用,例如 post
、neg
、transfer
、drawer
费用
ref_no | charges |
---|---|
001 | POSTEX USD 100 B^NEGO USD 200 B^TRAN USD 150 |
002 | POSTEX USD 400 B^TRAN USD 350 |
003 | NEGO USD 700 B^TRAN USD 350 |
004 | DRAW USD 700 |
现在我想要的是这样的:
ref_no | POSTEX | NEGO | TRAN | DRAW |
---|---|---|---|---|
001 | POSTEX USD 100 | NEGO USD 200 | TRAN USD 150 | |
002 | POSTEX USD 400 | TRAN USD 350 | ||
003 | NEGO USD 700 | TRAN USD 350 | ||
004 | DRAW USD 700 |
我试过使用 lateral view
+ split
但它不起作用,有没有其他方法可以使用 SparkSQL 或 MySql?
在 Spark SQL 中使用 regexp_extract
函数的一种方法:
spark.sql(r"""
SELECT ref_no,
regexp_extract(charges, '(POSTEX USD \d+)', 1) AS POSTEX,
regexp_extract(charges, '(NEGO USD \d+)', 1) AS NEGO,
regexp_extract(charges, '(TRAN USD \d+)', 1) AS TRAN,
regexp_extract(charges, '(DRAW USD \d+)', 1) AS DRAW
FROM my_table
""").show()
#+------+--------------+------------+------------+------------+
#|ref_no| POSTEX| NEGO| TRAN| DRAW|
#+------+--------------+------------+------------+------------+
#| 001|POSTEX USD 100|NEGO USD 200|TRAN USD 150| |
#| 002|POSTEX USD 400| |TRAN USD 350| |
#| 003| |NEGO USD 700|TRAN USD 350| |
#| 004| | | |DRAW USD 700|
#+------+--------------+------------+------------+------------+