Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将列从StringType转换为Json(对象)_Scala_Apache Spark - Fatal编程技术网

Scala 将列从StringType转换为Json(对象)

Scala 将列从StringType转换为Json(对象),scala,apache-spark,Scala,Apache Spark,下面是一个示例数据 val df4 = sc.parallelize(List( ("A1",45, "5", 1, 90), ("A2",60, "1", 1, 120), ("A6", 30, "9", 1, 450), ("A7", 89, "7", 1, 333), ("A7", 89, &

下面是一个示例数据

val df4 = sc.parallelize(List(
  ("A1",45, "5", 1, 90),
  ("A2",60, "1", 1, 120),
  ("A6", 30, "9", 1, 450),
  ("A7", 89, "7", 1, 333),
  ("A7", 89, "4", 1, 320),
  ("A2",60, "5", 1, 22),
  ("A1",45, "22", 1, 1)
)).toDF("CID","age", "children", "marketplace_id","value")
感谢@Shu提供了这段代码

val df5 = df4.selectExpr("CID","""to_json(named_struct("id", children)) as item""", "value", "marketplace_id")
当您执行
df5.d类型时

(CID,StringType), (item,StringType), (value,IntegerType), (marketplace_id,IntegerType)
列项是字符串类型的,有没有一种方式可以是json/对象类型的(如果是这样的话)

编辑1: 我将在这里描述我试图实现的目标,以上两个步骤保持不变

val w = Window.partitionBy("CID").orderBy(desc("value"))
val sorted_list = df5.withColumn("item", collect_list("item").over(w)).groupBy("CID").agg(max("item") as "item")
输出:

+---+-------------------------+
|CID|item                     |
+---+-------------------------+
|A6 |[{"id":"9"}]             |
|A2 |[{"id":"1"}, {"id":"5"}] |
|A7 |[{"id":"7"}, {"id":"4"}] |
|A1 |[{"id":"5"}, {"id":"22"}]|
+---+-------------------------+
现在,
[]
中的任何内容都是一个字符串。这导致我们正在使用的工具之一出现问题


对不起,请原谅我是scala新手,如果这是一个基本问题,请回答。

使用
struct
类型存储
json
数据,检查下面的代码

scala> dfa
.withColumn("item_without_json",struct($"cid".as("id")))
.withColumn("item_as_json",to_json($"item_without_json"))
.show(false)

+---+-----------+-----+--------------+-----------------+------------+
|CID|item       |value|marketplace_id|item_without_json|item_as_json|
+---+-----------+-----+--------------+-----------------+------------+
|A1 |{"id":"A1"}|90   |1             |[A1]             |{"id":"A1"} |
|A2 |{"id":"A2"}|120  |1             |[A2]             |{"id":"A2"} |
|A6 |{"id":"A6"}|450  |1             |[A6]             |{"id":"A6"} |
|A7 |{"id":"A7"}|333  |1             |[A7]             |{"id":"A7"} |
|A7 |{"id":"A7"}|320  |1             |[A7]             |{"id":"A7"} |
|A2 |{"id":"A2"}|22   |1             |[A2]             |{"id":"A2"} |
|A1 |{"id":"A1"}|1    |1             |[A1]             |{"id":"A1"} |
+---+-----------+-----+--------------+-----------------+------------+

根据您对将数据集转换为json所做的评论,您将使用:

df4
  .select(collect_list(struct($"CID".as("id"))).as("items"))
  .write()
  .json(path)
输出将如下所示:

{"items":[{"id":"A1"},{"id":"A2"},{"id":"A6"},{"id":"A7"}, ...]}

如果您需要内存中的东西来传递给函数,而不是
write().json(…)
使用
toJSON

本机spark类型是一个结构,没有json类型。有什么解决方法吗?我只是不希望它是StringType。正如@Lamanus所说,有一种特殊的
struct
类型用于表示数据帧中的复杂对象。你想用JSON实现什么?看起来里面的所有数据都已经是记录的一部分了,所以我看不到让
有什么意义,因为有一个工具要求该列的格式为{“items”:“[{“id”:“value”},{“id”:“value2”},{“id”:“value3”}]”},请看一看。请将问题更改为说明输入和预期输出的实际问题。item_as_json仍然是StringType。spark没有json数据类型,您可以存储与struct type相同的数据。。检查我已经添加了两列,一列是
item\u,不带json
,另一列是
item\u,不带json
列,转换为json
item\u,作为\u json
感谢您的时间。我会找到解决办法,或者改变我的方法,或者像你说的那样,如果我可以使用struct实现,我会尝试。如果你想将
json
作为对象,你需要将
json
转换为spark原生数据类型。。i、 e
struct
map
类型。
{"items":[{"id":"A1"},{"id":"A2"},{"id":"A6"},{"id":"A7"}, ...]}