繁体   English   中英

如何在 Spark Scala 中将列数据类型转换为字符串?

[英]How do I convert a Column DataType to String in Spark Scala?

我正在尝试调用 from_json 方法并希望动态获取 JSON 的模式。 问题在于 third.withColumn 行,因为它似乎不喜欢 Seq[Column]。

val randomStringGen = udf((length: Int) => {
scala.util.Random.alphanumeric.take(length).mkString
})

val randomKeyGen = udf((key: String, value: String) => {
s"""{"${key}": "${value}"}"""
})

val resultDF = initDF
.withColumn("value", randomStringGen(lit(10)))
.withColumn("keyValue", randomKeyGen(lit("key"), col("value")))
.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS).schema))

错误:值 toDS 不是 Seq[org.apache.spark.sql.Column].withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue" )).toDS).模式))

我有一个已知的解决方案,它只是对示例 JSON 进行硬编码:

val jsData = """{"key": "value"}"""

并将 col("keyValue") 替换为硬编码变量。

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(jsData).toDS).schema))

这有效并产生了我想要的结果,但如果我有一个大的 json,那么这种方法可能会非常麻烦。

你写的有两个小错误。

首先,如果你想在Seq上使用toDS方法,你需要import spark.implicits._ 这个方法在那里定义。 这样做应该可以消除您的第一个错误。

其次,您尝试使用的from_json function 具有以下 function 签名:

def from_json(e: Column, schema: StructType): Column

所以第二个字段schema应该是一个 StructType。 这是 Dataset 的.schema方法返回的内容。 所以,你的括号之一是错误的 position。

代替

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS.schema)))

你应该有

.withColumn("key", from_json(col("keyValue"), spark.read.json(Seq(col("keyValue")).toDS).schema))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM