web-dev-qa-db-ja.com

空/空のフィールド値で新しいデータフレームを作成する

既存のデータフレームから新しいデータフレームを作成していますが、この新しいDFに新しい列(以下のコードでは「field1」)を追加する必要があります。どうすればいいですか?実用的なサンプルコードの例に感謝します。

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"); 
23
sshroff

lit(null)を使用できます:

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))

ここでの1つの問題は、列タイプがnullであることです。

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

csvライターによって保持されません。厳しい要件である場合は、DataTypeのいずれかを使用して、列を特定の型(たとえば、String)にキャストできます。

import org.Apache.spark.sql.types.StringType

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

または文字列の説明

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

または、次のようなUDFを使用します。

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)

Python同等のものはここにあります: 空の列をspark DataFrame に追加します

67
zero323