有没有一种简单的方法将给定的Row对象转换为JSON?
找到了关于将整个Dataframe转换为JSON输出的内容: Spark Row to JSON
但我只想将一个Row转换为JSON。以下是我尝试做的伪代码。
更精确地说,我在Dataframe中以JSON格式作为输入读取数据。 我正在生成一个新的输出,主要基于列,但是其中包括一个JSON字段,用于存储所有不适合列的信息。
我的问题是:编写此函数(convertRowToJson())的最简单方法是什么?
def convertRowToJson(row: Row): String = ???
def transformVenueTry(row: Row): Try[Venue] = {
Try({
val name = row.getString(row.fieldIndex("name"))
val metadataRow = row.getStruct(row.fieldIndex("meta"))
val score: Double = calcScore(row)
val combinedRow: Row = metadataRow ++ ("score" -> score)
val jsonString: String = convertRowToJson(combinedRow)
Venue(name = name, json = jsonString)
})
}
Psidom的解决方案:
def convertRowToJSON(row: Row): String = {
val m = row.getValuesMap(row.schema.fieldNames)
JSONObject(m).toString()
}
仅在行只有一个级别时才有效,而不是嵌套行。这是模式:
StructType(
StructField(indicator,StringType,true),
StructField(range,
StructType(
StructField(currency_code,StringType,true),
StructField(maxrate,LongType,true),
StructField(minrate,LongType,true)),true))
也尝试了Artem的建议,但没有编译:
def row2DataFrame(row: Row, sqlContext: SQLContext): DataFrame = {
val sparkContext = sqlContext.sparkContext
import sparkContext._
import sqlContext.implicits._
import sqlContext._
val rowRDD: RDD[Row] = sqlContext.sparkContext.makeRDD(row :: Nil)
val dataFrame = rowRDD.toDF() //XXX does not compile
dataFrame
}