当前位置: 首页 > 面试题库 >

如何在Spark 2 Scala中将Row转换为json

谷梁迪
2023-03-14
问题内容

有一种简单的方法可以将给定的Row对象转换为json吗?

但是我只想将一个Row转换为json。这是我要尝试执行的伪代码。

更准确地说,我正在读取json作为Dataframe中的输入。我正在产生主要基于列的新输出,但对于所有不适合列的信息都具有一个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
}

问题答案:

我需要阅读json输入并产生json输出。大多数字段是单独处理的,但是只需保留几个json子对象。

当Spark读取数据帧时,它将记录转换为行。行是一个类似于json的结构。可以将其转换并写到json中。

但是我需要将一些子json结构分解为字符串以用作新字段。

可以这样完成:

dataFrameWithJsonField = dataFrame.withColumn("address_json", to_json($"location.address"))

location.address是传入的基于json的数据框的子json对象的路径。address_json是该对象的列名,该列名转换为json的字符串版本。

to_json 在Spark 2.1中实现。

如果使用json4s生成输出json,则应将address_json解析为AST表示,否则输出json将转义address_json部分。



 类似资料:
  • 我正在尝试从RDD[cassandraRow]创建一个数据帧。。但我不能,因为createDataframe(RDD[Row],schema:StructType)需要RDD[Row],而不是RDD[cassandraRow]。 我怎样才能做到这一点 根据这个问题的答案,如何在spark中将rdd对象转换为数据帧 (答案之一)关于在RDD[行]上使用toDF()从RDD获取数据帧的建议,对我来说并

  • 问题内容: 我想从Spark v.1.6(使用scala)数据帧创建JSON。我知道这样做很简单。 但是,我的问题看起来有些不同。例如,考虑具有以下列的数据框: 我想最后有一个数据框 其中,C是含有JSON ,,。不幸的是,我在编译时不知道数据框是什么样子(除了列,列始终是“固定的”)。 至于我为什么需要这个的原因:我正在使用Protobuf发送结果。不幸的是,我的数据框有时具有比预期更多的列,并

  • 问题内容: 我已经编写了使用SparkSQL访问Hive表的代码。这是代码: 我想知道如何将完整的输出转换为String或String数组?当我尝试与另一个只能传递String或String type Array值的模块一起使用时。 我试过其他方法,例如将类型转换为字符串值或将其转换为字符串值。但是没有为我工作。 请让我知道如何将DataSet值转换为String? 问题答案: 这是Java中的示

  • 问题内容: 我是Java的新手,想知道double转换为int cast如何工作吗?我知道,只需将低32位转换为int就很容易了,但是将double(64位)转换为int(32位)呢?来自二进制的double中的那64位是Double- precision浮点格式(Mantissa),那么它如何在内部转换为int? 问题答案: 所有这些都记录在JLS的5.1.3节中。 第一步,将浮点数转换为lon

  • 问题内容: 以下是我的json文件输入 码 输出量 因此,在这里我确实得到了答案,但是没有打印一次,而是打印了7次。如何解决此问题。 问题答案: 是一个字典,您不需要对其进行迭代。您可以使用键直接访问值。 例如:

  • 问题内容: 我想将json字符串转换为javascript中的yaml格式。我从过去两天开始尝试在Google上找到任何解决方案或库。有适用于Java的答案,但不适用于javascript。 假设我有这样的json字符串: 转换为yaml: 有一个在线转换器http://www.json2yaml.com/,但是如何在javascript中转换成它。 问题答案: YAML是JSON的超集。由于任何