2016-12-07 2 views
0

Я пытаюсь выполнить несколько столбцов в фрейме данных. Мой список столбцов присутствует в переменной. Я пытаюсь передать эту переменную в функцию concat, но не могу этого сделать.Как конкатрировать несколько столбцов в кадре данных с помощью Scala

Ex: base_tbl_columns содержит список столбцов, и я использую код ниже, чтобы выбрать все столбцы, упомянутые в varibale.

scala> val base_tbl_columns = scd_table_keys_df.first().getString(5).split(",") 
    base_tbl_columns: Array[String] = Array(acct_nbr, account_sk_id, zip_code, primary_state, eff_start_date, eff_end_date, load_tm, hash_key, eff_flag) 

val hist_sk_df_ld = hist_sk_df.select(base_tbl_columns.head,base_tbl_columns.tail: _*) 

Аналогичным образом, у меня есть еще один список, который я хочу использовать для конкатенации. Но там функция concat не принимает аргументы .head и .tail.

scala> val hash_key_cols = scd_table_keys_df.first().getString(4) 
    hash_key_cols: String = primary_state,zip_code 

Here I am hard coding the value primary_state and zip_code. 
    .withColumn("hash_key_col",concat($"primary_state",$"zip_code")) 

Here I am passing the variable hash_key_cols . 
    .withColumn("hash_key_col",concat(hash_key_cols)) 

Я был в состоянии сделать это в python, используя приведенный ниже код.

hist_sk_df = hist_tbl_df.join(broadcast(hist_tbl_lkp_df) ,primary_key_col,'inner').withColumn("eff_start_date",lit(load_dt))**.withColumn('hash_key_col',F.concat(*hash_key_cols))**.withColumn("hash_key",hash_udf('hash_key_col')).withColumn("eff_end_date",lit(eff_close_dt)).withColumn("load_tm",lit(load_tm)).withColumn("eff_flag",lit(eff_flag_curr)) 

ответ

1

Либо:

val base_tbl_columns: Array[String] = ??? 

df.select(concat(base_tbl_columns.map(c => col(c)): _*)) 

или:

df.select(expr(s"""concat(${base_tbl_columns.mkstring(",")})""")) 
+0

Он работал для меня. Я использовал первый вариант. scala> val hash_key_cols = scd_table_keys_df.first(). getString (4) .split (",") hash_key_cols: Array [String] = Array (primary_state, zip_code) val hist_sk_df = hist_tbl_df.join (broadcast (hist_tbl_lkp_df), Seq (primary_key_col), «internal») .withColumn («eff_start_date», lit (load_dt)) .Column («hash_key_col», concat (hash_key_cols.map (c => col (c)): _ *)) – user3858193

+0

Хотите использовать подобный varibale в join также scala> primary_key_col res59: String = acct_nbr scala> delta_primary_key_col res60: String = delta_acct_n. Я хочу использовать эту две переменные в моей клавише join ... Как это можно сделать. val cdc_new_acct_df = delta_src_rename_df.join (hist_tgt_tbl_Y_df, (delta_src_rename_df ($ delta_primary_key_col) == hist_tgt_tbl_Y_df ($ primary_key_col), "left_outer")) – user3858193

Смежные вопросы