拆开数据库表某列内容后转成字段
查询 BigQuery 数据库的某张表,结果的第 4 个字段是逗号分隔的字符串。
user_id |
fst_name |
lst_name |
team_list |
1111 |
DANNY |
CRUISE |
TEAM34,TEAM12,TEAM4 |
2222 |
CARLOS |
SMITH |
TEAM34,TEAM44,TEAM12 |
33333 |
SASHA |
CONOR |
TEAM5,TEAM34,TEAM44 |
用 Java 实现:保留前 3 个字段,把第 4 个字段的所有内容拆分去重,作为第 4-N 个字段名,内容填 0/1 表示本行原来是否包含该值。结果存为 csv 文件。
user_id,fst_name,lst_name,TEAM34,TEAM12,TEAM4,TEAM44,TEAM5 1111,DANNY,CRUISE,1,1,1,0,0 2222,CARLOS,SMITH,1,1,0,1,0 33333,SASHA,CONOR,1,0,0,1,1 |
编写SPL代码:
A |
|
1 |
=bigqry1.query("select user_id,fst_name,lst_name,team_list from data where p=1") |
2 |
=A1.news(team_list.split@c();user_id,fst_name,lst_name,~) |
3 |
=A2.pivot@s(#1,#2,#3; #4,if(#4,1,0)) |
4 |
=T("d:/result.csv":A3) |
A1:通过 JDBC 查询数据库。
A2:将第 4 列拆成多项,每项生成一条记录,~ 表示当前项。
A3:行转列,其中前 3 列保留,第 4 列的内容转为新字段名,如果包含第 4 列则新内容填 1,否则填 0。
A4:将计算结果写入 csv。
Java 集成 SPL 可参考 Java 如何调用 SPL 脚本
问题来源:https://stackoverflow.com/questions/74645043/how-do-i-write-csv-file-with-dynamic-headers-in-apache-beam-java
英文版 https://c.scudata.com/article/1724988306543