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

如何将var转换为List?

上官树
2023-03-14

如何将一个var转换为两个var列表?

下面是我的输入变量:

val input="[level:1,var1:name,var2:id][level:1,var1:name1,var2:id1][level:2,var1:add1,var2:city]"

我希望我的结果应该是:

  val first= List(List("name","name1"),List("add1"))
  val second= List(List("id","id1"),List("city"))

共有2个答案

周泰
2023-03-14

reduceByKey是实现所需输出的重要功能。关于逐步还原的更多解释bykey解释

您可以执行以下操作

val input="[level:1,var1:name1,var2:id1][level:1,var1:name2,var2:id2][level:2,var1:add1,var2:city]"
val groupedrdd = sc.parallelize(Seq(input)).flatMap(_.split("]\\[").map(x => {
  val values = x.replace("[", "").replace("]", "").split(",").map(y => y.split(":")(1))
  (values(0), (List(values(1)), List(values(2))))
})).reduceByKey((x, y) => (x._1 ::: y._1, x._2 ::: y._2))


val first = groupedrdd.map(x => x._2._1).collect().toList
//first: List[List[String]] = List(List(add1), List(name1, name2))
val second = groupedrdd.map(x => x._2._2).collect().toList
//second: List[List[String]] = List(List(city), List(id1, id2))
朱博实
2023-03-14

首先,输入不是有效的json

val input="[level:1,var1:name,var2:id][level:1,var1:name1,var2:id1][level:2,var1:add1,var2:city]"

您必须使其成为有效的json RDD(因为您将使用apache spark)

val validJsonRdd = sc.parallelize(Seq(input)).flatMap(x => x.replace(",", "\",\"").replace(":", "\":\"").replace("[", "{\"").replace("]", "\"}").replace("}{", "}&{").split("&"))

一旦有了有效的json rdd,就可以轻松地将其转换为数据帧,然后应用已有的逻辑

import org.apache.spark.sql.functions._
val df = spark.read.json(validJsonRdd)
  .groupBy("level")
  .agg(collect_list("var1").as("var1"), collect_list("var2").as("var2"))
  .select(collect_list("var1").as("var1"), collect_list("var2").as("var2"))

您应该在数据帧中获得所需的输出

+------------------------------------------------+--------------------------------------------+
|var1                                            |var2                                        |
+------------------------------------------------+--------------------------------------------+
|[WrappedArray(name1, name2), WrappedArray(add1)]|[WrappedArray(id1, id2), WrappedArray(city)]|
+------------------------------------------------+--------------------------------------------+

如果需要,您可以将数组转换为列表

要获取问题中的值,您可以执行以下操作

val rdd = df.collect().map(row => (row(0).asInstanceOf[Seq[Seq[String]]], row(1).asInstanceOf[Seq[Seq[String]]]))

val first = rdd(0)._1.map(x => x.toList).toList
//first: List[List[String]] = List(List(name1, name2), List(add1))

val second = rdd(0)._2.map(x => x.toList).toList
//second: List[List[String]] = List(List(id1, id2), List(city))

我希望答案有帮助

 类似资料:
  • 问题内容: 我有一个下面的代码- 通过HttpClient连接到Web服务到PHP文件 从SQL查询返回结果 返回格式是一个jArray(一个JSONArray) 当我查看LogCat时,我看到了查询的所有“名称”,每条记录都被打印出来。我只需要将这些结果插入ListView中即可。我怎样才能做到这一点? PS-我没有ArrayAdapter的单独类。这可能是原因吗? 问题答案: 如果您只想显示t

  • 此API调用返回一个可能较大的列表 排序、搜索和访问一个潜在的大型LinkedList将非常缓慢,对我的程序来说是不可接受的。因此,我需要将列表转换为ArrayList,以确保程序的实际效率。但是,由于列表很可能已经是ArrayList,因此不必要地创建列表的新ArrayList副本将效率低下。 考虑到这些约束,我提出了以下方法将列表转换为ArrayList: 我的问题是:这是处理具有未知实现的列

  • 问题内容: 我在mySQL 5.1中有一个数据类型的日期列。如何将其转换为DATE? 这是我到目前为止所拥有的- 得到这个 错误-#1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在’FROM 7 FOR 4附近使用) 请帮忙。 问题答案: 您可以使用MySQL的功能 尽管我怀疑您使用Unix时间戳会更轻松

  • 问题内容: 有没有一种简单的方法可以避免处理文本编码问题? 问题答案: 您确实无法避免处理文本编码问题,但是Apache Commons中已有一些解决方案: 至: 至: 您只需要选择所需的编码即可。

  • 我在MongoDB中使用Java驱动程序3.0,以便通过Web服务发送JSON。 当我想将文档对象(org.bson.文档)转换为JSON时,我使用,当我想将JSON转换为文档对象时,我使用。 但是,当我处理文档列表时(如JSON中所示:

  • 问题内容: 如何使用Java将Dicom文件(.dcm)转换为jpeg图像?这是我的代码: 我在运行项目时遇到以下错误 请帮助并提前感谢 问题答案: 这是使用dcm4che 2将DICOM转换为JPEG的链接 以下是我的代码,效果很好,我将其与导入一起放置,因此可能用完了。 用于运行它的罐子 dcm4che-imageio-2.0.28.jar dcm4che-image-2.0.28.jar j