2015-08-18 26 views
15

Varolan bir veri çerçevesinden yeni bir Dataframe oluşturuyorum, ancak bu yeni DF'ye yeni sütun eklemem gerekiyor (kodun altındaki "field1"). Bunu nasıl yaparım? Örnek örnek çalışma örneği takdir edilecektir. BuradaBoş/boş alan değerleriyle yeni Dataframe oluştur

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

case class Record(foo: Int, bar: String) 
val df = Seq(Record(1, "foo"), Record(2, "bar")).toDF 

val dfWithFoobar = df.withColumn("foobar", lit(null: String)) 

Bir problem kolon tipi null olmasıdır:

scala> dfWithFoobar.printSchema 
root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: null (nullable = true) 

ve csv yazar tarafından korunmaz

val edwDf = omniDataFrame 
    .withColumn("field1", callUDF((value: String) => None)) 
    .withColumn("field2", 
    callUdf("devicetypeUDF", (omniDataFrame.col("some_field_in_old_df")))) 

edwDf 
    .select("field1", "field2") 
    .save("odsoutdatafldr", "com.databricks.spark.csv"); 

cevap

38

O lit(null) kullanmak mümkündür. zor bir gereklilik ise böyle bir UDF ya DataType

import org.apache.spark.sql.types.StringType 

df.withColumn("foobar", lit(null).cast(StringType)) 

veya dize açıklaması

df.withColumn("foobar", lit(null).cast("string")) 

ile, (String Diyelim) belirli türüne sütun döküm veya kullanabilirsiniz:

val getNull = udf(() => None: Option[String]) // Or some other type 

df.withColumn("foobar", getNull()).printSchema 
root 
|-- foo: integer (nullable = false) 
|-- bar: string (nullable = true) 
|-- foobar: string (nullable = true) 
+1

@ zero323, bunu paylaştığınız için çok yararlı. Diğer türler için düzenlemelerimi görün. –

+0

@DmitriySelivanov Yardımcı düzenlemeniz için teşekkür ederiz. Bir süre önce editörlerle yapılan bazı başarısız deneylerden sonra 'Option'ı kullanma fikrinden vazgeçtim :) – zero323

+1

not:' toDF() 'şunu gerektirir import import.implicits._' – Boern