接受scala中表名和列名的列表,并返回列值的附加前缀

velaa5lx  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(269)

我想在下面的表格中从用户那里获取输入。可能有 n 数量 table_name 以及 column_name 在这个字符串中。
输入结构:

input="tablename_1:column_name|tablename_2:column_name,tablename_1:column_name|tablename_2:column_name,tablename_1:column_name|tablename_3:column_name"

示例:

input="customer:name|customer_tmp:name,customer:period|account:period,customer:id|balance:balance_id"

我要实现的逻辑:
表格名称 customer_tmp 添加后缀 pm_ 列前面(示例中的名称)。
表格名称 account 添加后缀 acct_ 列前面(示例中的句点)。
表格名称 balance 添加后缀 bal_ 在列前面(示例中为balance\u id)。
输入示例需要的输出:

return_value="name|pm_name,period|acct_period,id|bal_balance_id"

如何使此代码尽可能通用?

uajslkp6

uajslkp61#

一种可能的解决方案是首先将输入字符串拆分为元组列表:

val split_input = input.split(",")
  .map(_.split("\\|").map(_.split(":")))
  .map(v => (v(1)(0), v(0)(1), v(1)(1)))

打印方式 foreach(println) 给予:

(customer_tmp,name,name)
(account,period,period)
(balance,id,balance_id)

接下来我们把通缉的逻辑放在一个 Map 为了便于修改:

val prefix_logic = Map("customer_tmp" -> "pm_", "account" -> "acct_", "balance" -> "bal_")

现在,我们可以应用逻辑并创建最后一个字符串:

val split_output = split_input.map(v => (v._2, prefix_logic.get(v._1).get + v._3))

val return_value = split_output.map(v => v._1 + "|" + v._2).mkString(",")

结果:

name|pm_name,period|acct_period,id|bal_balance_id

相关问题