2017-01-30 2 views
0

Я ищу способ добавления имен столбцов к данным строки фрейма данных. Количество столбцов может отличаться время от времениDataFrame: добавить имя столбца в данные строк

Я Спарк 1.4.1

У меня есть dataframe:

Edit:: все данные String типа только

+---+----------+ 
|key|  value| 
+---+----------+ 
|foo|  bar| 
|bar| one, two| 
+---+----------+ 

Я хотел бы получить:

+-------+---------------------+ 
    |key |    value| 
    +-------+---------------------+ 
    |key_foo|   value_bar| 
    |key_bar| value_one, value_two| 
    +---+-------------------------+ 

Я попытался

import org.apache.spark.sql._ 
import org.apache.spark.sql.functions._ 

val concatColNamesWithElems = udf { seq: Seq[Row] => 
    seq.map { case Row(y: String) => (col +"_"+y)}} 
+0

какой тип ваш 'value' столбец? – mtoto

+0

также с какой ошибкой вы столкнулись? – Chobeat

+0

@mtoto 'value' имеет значения' String' только – Toren

ответ

1

Сохранить DataFrame в таблице (Ex: dfTable), так что вы пишете SQL на нем.

df.registerTempTable("dfTable") 

Создать UDF и Регистрация: Я полагаю, ваш value тип столбца String

sqlContext.udf.register("prefix", (columnVal: String, prefix: String) => 
    columnVal.split(",").map(x => prefix + "_" + x.trim).mkString(", ") 
) 

Использование UDF в запросе

//prepare columns which have UDF and all column names with AS 
//Ex: prefix(key, "key") AS key // you can this representation 
val columns = df.columns.map(col => s"""prefix($col, "$col") AS $col """).mkString(",") 


println(columns) //for testing how columns framed 

val resultDf = sqlContext.sql("SELECT " + columns + " FROM dfTable") 
+0

Спасибо за быстрый ответ! Насколько я понимаю, будут использоваться только имена команд '' key '',' 'value" '. К сожалению, имена столбцов и количество столбцов могут быть разными при каждом выполнении кода. Я ищу более общее решение – Toren

+0

Вы можете использовать udf как 'prefixCol (column_name_in_table," prefix_string ")' in 'select'. С помощью этого вы можете добавить любой префикс к значениям в столбце. – mrsrinivas

+0

@Toren: этот udf обеспечивает максимальное общее решение. Дайте мне знать, если вы думаете, что это не будет работать в общем виде. _Как я понимаю, только имена команд «ключ», «значение» будут работать. ** Он работает с любым столбцом (строковым типом) и любым префиксом **. – mrsrinivas