我正在尝试将数据框中的几个字段写入 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。
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)
// 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层中导致异常(因为是错误的)。 我确实需要来序列化。只是没有反序列化。