2015-10-18 26 views
5

ile sütununa çevirme Sütunu: user, address1, address2, address3, phone1, phone2 ve benzeri bir veri çerçevem ​​var. Ben bu veri çerçevesini dönüştürmek istediğiniz - kullanıyorum haritaya sütunları dönüştürmek başardı user, address, phone where address = Map("address1" -> address1.value, "address2" -> address2.value, "address3" -> address3.value)Birden çok farklı sütunu, Spark Dataframe scala

:

val mapData = List("address1", "address2", "address3") 
df.map(_.getValuesMap[Any](mapData)) 

ama benim df Bu nasıl ekleneceğini emin değilim.

Kıvılcım ve ölçekleme konusunda yeniyim ve burada biraz yardıma ihtiyacım var.

cevap

6

Kıvılcım> = 2.0

Sen udf atlamak ve SQL fonksiyonu (Python içinde create_map) map kullanabilirsiniz:

import org.apache.spark.sql.functions.map 

df.select(
    map(mapData.map(c => lit(c) :: col(c) :: Nil).flatten: _*).alias("a_map") 
) 

Spark < 2.0

olarak bildiğim kadarıyla Bunu yapmak için doğrudan bir yol yoktur.

val dfWithStruct = df.withColumn("address", struct(mapData.map(col): _*)) 

büyük avantajı kolayca değerlerini işleyebilir olmasıdır:

import org.apache.spark.sql.functions.{udf, array, lit, col} 

val df = sc.parallelize(Seq(
    (1L, "addr1", "addr2", "addr3") 
)).toDF("user", "address1", "address2", "address3") 

val asMap = udf((keys: Seq[String], values: Seq[String]) => 
    keys.zip(values).filter{ 
    case (k, null) => false 
    case _ => true 
    }.toMap) 

val keys = array(mapData.map(lit): _*) 
val values = array(mapData.map(col): _*) 

val dfWithMap = df.withColumn("address", asMap(keys, values)) 

UDF'leri gerektirmeyen başka bir seçenek yerine haritanın alanını yapısına bir şudur: Böyle bir UDF kullanabilirsiniz farklı türleri.