既存のデータフレームから新しいデータフレームを作成していますが、この新しい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");
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 に追加します