我将如何将数据框的一部分转换为 json 对象 [重复]
Posted
技术标签:
【中文标题】我将如何将数据框的一部分转换为 json 对象 [重复]【英文标题】:How will I convert part of a dataframe to an json object [duplicate] 【发布时间】:2018-02-16 08:03:14 【问题描述】:假设我有一个这样的数据框
val df = Seq((2012, 8, "Batman", 9.8), (2012, 8, "Hero", 8.7), (2012, 7, "Robot", 5.5), (2011, 7, "Git", 2.0)).toDF("year", "month", "title", "rating")
我可以像这样将整行转换为 json。
val jsonColumns = df.select("year", "month", "title", "rating").toJSON
我怎样才能让json和年份中的月份、年份和标题脱离json对象,但仍然是数据框的一部分(所以我可以将它用作分区列)?
【问题讨论】:
【参考方案1】:我怎样才能让json和年份中的月份、年份和标题脱离json对象,但仍然是数据框的一部分(所以我可以将它用作分区列)
你可以使用to_json
和struct
内置函数作为
import org.apache.spark.sql.functions._
df.select(to_json(struct(col("year"), col("month"), col("title"))).as("json"), col("year"))
你应该得到输出为
+----------------------------------------+----+
|json |year|
+----------------------------------------+----+
|"year":2012,"month":8,"title":"Batman"|2012|
|"year":2012,"month":8,"title":"Hero" |2012|
|"year":2012,"month":7,"title":"Robot" |2012|
|"year":2011,"month":7,"title":"Git" |2011|
+----------------------------------------+----+
更新
to_json
函数将返回一个 json 字符串。如果您需要 json 对象,则不需要 to_json
函数。相反,您可以执行以下操作
df.select(struct(col("year"), col("month"), col("title")).as("json"), col("year")).toJSON
【讨论】:
大君,谢谢。现在,当我将数据写入具有严格对象的表时,这是不可能的。因为它只是一个字符串,而不是一个 json 对象。你能告诉我如何转换这个对象并将其加载到结构列中。 @Srinivas,在这种情况下不要使用 to_json 函数。只需将 struct 用作df.select(struct(col("year"), col("month"), col("title")).as("json"), col("year")).toJSON
就可以了。它不是马哈拉詹,它是马哈拉詹。我来自尼泊尔。
@Maharjan,感谢您的回复。当我尝试这个时,所有的双引号都是反斜杠,如 \"year\",因此配置单元表无法读取数据。抱歉输入你的名字有误,我以为你的名字是南印度人。
我不使用 hive,所以我不能告诉你确切的解决方案。当我写入文本文件时,它工作正常。您是否尝试删除 .toJSON
@Maharjan,你是对的,在我的机器上也是如此。这是 Hive 无法破译 \.我会尝试编写类似 json 解析器的东西。以上是关于我将如何将数据框的一部分转换为 json 对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将 pandas 数据帧转换为 json 对象 - pandas
如何将内容不同但结构相同的 JSON 字符串转换为 C# 对象?