gpt4 book ai didi

scala - Spark CSV writer 为空字符串输出双引号

转载 作者:行者123 更新时间:2023-12-01 21:28:04 27 4
gpt4 key购买 nike

我已经为 Scala Spark 编写了 UDF

import org.apache.spark.sql.functions.{col, udf}
def mapToString: Map[String, Double] => String = /** // returns k1:v1,k2:v2 or empty string if map is empty */

val mapToStringUDF = udf(mapToString)

// Then I try to save my Dataset as csv
myDataset
.withColumn("map_str", mapToStringUDF(col("map")))
.drop("map")
.write
.option("header", false)
.option("delimiter", "\t")
.csv("output.csv")

如果 mapToStringUDF 返回空字符串,它会输出 ""。如果 mapToStringUDF 返回空字符串,我不想在输出中得到任何结果。

正确的做法是什么?

最佳答案

Spark DataFrameWriter 有两个可以设置的.csv 格式选项参数:nullValueemptyValue,您可以同时设置它们为 null 而不是空字符串。请参阅 DataFrameWriter 文档 here .

在您的具体示例中,您只需将选项添加到您的 write 语句中:

myDataset
.withColumn("map_str", mapToStringUDF(col("map")))
.drop("map")
.write
.option("emptyValue", null)
.option("nullValue", null)
.option("header", "false")
.option("delimiter", "\t")
.csv("output.csv")

或者这里有一个完整的例子,包括测试数据:

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val data = Seq(
Row(null, "20200506", "Hello"),
Row(2, "20200607", null),
Row(3, null, "World")
)

val schema = List(
StructField("Item", IntegerType, true),
StructField("Date", StringType, true),
StructField("Message", StringType, true)
)

val testDF = spark.createDataFrame(
spark.sparkContext.parallelize(data),
StructType(schema)
)

testDF.write
.option("emptyValue", null)
.option("nullValue", null)
.option("header", "true")
.csv(PATH)

生成的原始 .csv 应该如下所示:

Item,Date,Message
,20151231,Hello
2,20160101,
3,,World

关于scala - Spark CSV writer 为空字符串输出双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62819776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com