当前位置: 首页 > 知识库问答 >
问题:

如何将一组字段写入JSON?

乌灿
2023-03-14

我正在尝试将数据框中的几个字段写入 JSON。数据框中的数据结构是

Key|col1|col2|col3|col4
key|a   |b   |c   |d
Key|a1  |b1  |c1  |d1

现在,我正试图将col1到col4字段转换为JSON,并为JSON字段命名

预期产出

[Key,{cols:[{col1:a,col2:b,col3:c,col4:d},{col1:a1,col2:b1,col3:c1,col4:d1}]

我为此写了一个udf。

val summary = udf( 
(col1:String, col2:String, col3:String, col4:String) => "{\"cols\":[" + "  {\"col1\":" + col1 + ",\"col2\":" + col2 + ",\"col3\":" + col3 + ",\"col4\":" + col4 + "}]}"
)

val result = input.withColumn("Summary",summary('col1,'col2,'col3,'col4))
val result1 = result.select('Key,'Summary)
result1.show(10)

这就是我的结果

[Key,{cols:[{col1:a,col2:b,col3:c,col4:d}]}]
[Key,{cols:[{col1:a1,col2:b1,col3:c1,col4:d1}]}]

如您所见,它们没有分组。是否有使用UDF本身对这些行进行分组的方法。我是scala/Spark的新手,无法找到合适的udf。

共有2个答案

申高峯
2023-03-14

UDF将一行映射到一行。如果要将<code>数据帧

可能有一个特定于DataFrame的函数来执行此操作,但我会使用RDD功能执行此处理,如下所示:

val colSummary = udf( 
(col1:String, col2:String, col3:String, col4:String) => "{\"col1\":" + col1 + ",\"col2\":" + col2 + ",\"col3\":" + col3 + ",\"col4\":" + col4 + "}"
)
val colRDD = input.withColumn("Summary",summary('col1,'col2,'col3,'col4)).rdd.map(x => (x.getString(0),x.getString(5)))

这给了我们一个< code>RDD[(String,String)],它将允许我们使用< code>PairRDDFunctions,如< code>reduceByKey(参见文档)。元组的键是原始键,值是单个元素的json编码,我们需要将该元素聚合在一起以形成< code>cols列表。我们把它们粘在一起,组成一个逗号分隔的列表,然后加上开头和结尾,就完成了。

val result = colRDD.reduceByKey((x,y) => (x+","+y)).map(x => "["+x._1+",{\"cols\":["+x._2+"]}]")
result.take(10)
方飞白
2023-03-14
// Create your dataset
scala> val ds = Seq((1, "hello", 1L), (2, "world", 2L)).toDF("id", "token", "long")
ds: org.apache.spark.sql.DataFrame = [id: int, token: string ... 1 more field]

// select the fields you want to map to json
scala> ds.select('token, 'long).write.json("your-json")

// check the result
➜  spark git:(master) ✗ ls -ltr your-json/
total 16
-rw-r--r--  1 jacek  staff  27 11 kwi 17:18 part-r-00007-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00006-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00005-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00004-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff  27 11 kwi 17:18 part-r-00003-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00002-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00001-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 part-r-00000-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
-rw-r--r--  1 jacek  staff   0 11 kwi 17:18 _SUCCESS
➜  spark git:(master) ✗ cat your-json/part-r-00003-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
{"token":"hello","long":1}
➜  spark git:(master) ✗ cat your-json/part-r-00007-91f81f62-54bb-42ae-bddc-33829a0e3c16.json
{"token":"world","long":2}
 类似资料:
  • 问题内容: 我想用一个很长的数字分开的数字来计算。如何在Python2.7中做到这一点?我考虑过以某种方式将数字写入数组,以便可以使用array(x)访问数字: 问题在于,该数字有很多位数,因此手动进行将花费很长时间。那么我如何自动执行此操作? 问题答案: 您可以使用,而且功能喜欢这个 函数将转换为字符串。 函数将函数应用于字符串化数字的每个元素,以将字符串转换为整数。 输出量 如果您在一个循环中

  • 问题内容: 如何在Java中将字节数组写入文件? 问题答案: 可以使用IOUtils.write(字节[]数据,OutputStream的输出)从Apache的百科全书IO。

  • 问题内容: 我一直在尝试将数组写入文件。我知道如何将整数或字符串写入文件,但是要带一个数组会使我感到困惑。我现在正在使用这个: 问题答案: 就像其他人说的那样,您可以循环遍历数组并逐个打印出元素。为了使输出显示为数字而不是您看到的“字母和符号”,您需要将每个元素转换为字符串。因此,您的代码将如下所示: 如果您只想打印类似的数组,则可以使用此衬纸替换循环:

  • 问题内容: 我有一个示例数组如下 我想将此数组写入文件,例如我得到的文件如下 问题答案: 如果它是一个巨大的数组,并且在写入之前需要太多内存才能将其序列化为字符串,则可以使用流:

  • 我正在做一个井字游戏6x7(6行7列),所以我把它显示给用户 然后我想让用户输入“x”或“o”,但上面的数字是在一个二维整数数组中,而“x”和“o”都是字符,我怎么能把它们插入进去。我知道我可以用“0”和“1”来代替,但我想用“X”和“O”。

  • 我正在以以下方式使用JPA、Jackson和JAX-RS。 这个类没有的setter,因为它是自动生成的。即使我把二传手也没有区别。如果杰克逊需要的话,我不介意拥有它,但无论如何,它不应该被使用。 这是资源: 问题是,带有自己的,它应该被忽略,应该自动生成自己的。但是Jackson使用了中的,这会在JPA层中导致异常(因为是错误的)。 我确实需要来序列化。只是没有反序列化。