스칼라에서 테이블 이름 및 열 이름 목록을 수락하고 열 값에 추가 된 접두사를 반환합니다.

Aug 21 2020

아래 양식으로 사용자의 입력을 받고 싶습니다. 이 문자열 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"

구현하려는 논리 :

  • table_name 의 경우 열 앞에 customer_tmp접미사 pm_를 추가합니다 (예 : 이름).
  • table_name 의 경우 열 앞에 account접미사 acct_를 추가합니다 (예 : 마침표).
  • table_name 의 경우 열 앞에 balance접미사 bal_를 추가합니다 (예 : balance_id).

입력 예에 대한 원하는 출력 :

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

이 코드를 가능한 한 일반화하려면 어떻게해야합니까?

답변

Shaido Aug 21 2020 at 10:00

한 가지 가능한 해결책은 먼저 입력 문자열을 튜플 목록으로 분할하는 것입니다.

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으로 쉽게 수정할 수 있도록 원하는 로직을 a 에 유지합니다 .

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