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

如何在 Spark 中读取包含嵌套字段的值?[重复]

张亦
2023-03-14

我拥有的数据集充满了嵌套字段。例如,data.take(1) 的输出给出了 9 列,其中第 4 列 (c4) 有 3 个子字段,c4 的第 1 列有 3 个子字段,依此类推。

格式看起来有点像这样

[A,B,C,[[d1,d2,d3],D2,D3],E,[F1,[f1,[f21,f22,f23],f3,f4],F3,F4],G,H,I]

我想要一个数组数据结构的数组(然后可以展开为单个数组)。

只是为了让数据看起来更清晰:

A
B
C
D
  -D1
    -d1
    -d2
    -d3
  -D2
  -D3
E
F
  -F1
  -F2
    -f1
    -f2
      -f21
      -f22
      -f23
    -f3
    -f4
  -F3
  -F4
G
H
I

当然,我可以编写一个解析程序,递归地搜索给定记录的子字段,并生成这种树结构(作为数组数组)。然而,我希望在Spark中有一个更简单、更高效的预构建例程,以直接的方式处理这个问题。

Spark-Scala或PySpark中的任何答案都将受到欢迎。

共有1个答案

万俟高峻
2023-03-14

如果您已经使用spark将数据帧/数据集加载到内存中,有两种方法可以帮助您。尝试< code>df.printSchema()和< code>df.schema,其中< code>df是引用数据集的变量。第一个将在屏幕上打印带有数据类型的模式,第二个将返回可由您的代码遍历的< code>StructType对象。

更新:

所以现在你要方便地选择嵌套字段。

假设您有以下代码:

import org.apache.spark.sql.SparkSession

object Question51360175 extends App{
    val session = SparkSession.builder()
      .appName("spark-app").master("local[*]").getOrCreate()

    import session.implicits._

    case class TopLevel(someField: String, nestedLevel: NestedLevel)
    case class NestedLevel(key: Int, value: String)



    val df = Seq(
      TopLevel("first", NestedLevel(1, "Onnu")),
      TopLevel("second", NestedLevel(2, "Rendu"))
    ).toDF

    df.printSchema()

  df.show()
}

这将给你这种输出

root
 |-- someField: string (nullable = true)
 |-- nestedLevel: struct (nullable = true)
 |    |-- key: integer (nullable = false)
 |    |-- value: string (nullable = true)

+---------+-----------+
|someField|nestedLevel|
+---------+-----------+
|    first|  [1, Onnu]|
|   second| [2, Rendu]|
+---------+-----------+

现在,如果你想得到嵌套列,例如,你只想要嵌套类中的valueNestedLevel,你可以只编写df.select("nestedLevel.value"). show(),它会返回你

+-----+
|value|
+-----+
| Onnu|
|Rendu|
+-----+
 类似资料:
  • 这是我的 mongodb 集合的架构的一部分: 我已经获取了集合并将其存储在Spark数据框中,现在正在尝试提取变量列中的最内层值。 这工作得非常好,我能够得到数据结构的内部结构。 然而,一旦我尝试进一步深入: 我得到一个无效的语法错误。 df _ temp = df1 . select(df1 . variables . actives . data . 0 . active)< br > ^

  • 我试图在elasticsearch中对嵌套字段进行排序,但在按升序排序时,它总是在排序列表的顶部显示带有空值嵌套字段的文档。我希望排序(升序和降序),并希望空值嵌套字段文档出现在排序列表的末尾。 这是我正在使用的排序查询: 下面是我应用的与嵌套的“标记”字段相关的映射: 样品有效载荷:

  • 在嵌套字段中读取MongoDB更新数据后,我使用 我如何访问那个元素?(只是子元素而不是整个文档)< br >例如< code > db . users . findone({ _ id:' 123 ' },{ ' $ elem ':" friends . 0 . emails . 0 . email " }); 例如:< br >如果它是一个JavaScript对象,它将是< br> 如果是Py

  • 问题内容: 在Spark中有一个数据框: 如何将字段重命名为? [更新]: 不适用于嵌套字段,因此我尝试了这种hacky和不安全的方法: 我知道设置私有属性不是一个好习惯,但我不知道其他为df设置架构的方法 我觉得我是在一个正确的轨道,但仍显示为旧名,虽然是 问题答案: 蟒蛇 无法修改单个嵌套字段。您必须重新创建一个整体结构。在这种特殊情况下,最简单的解决方案是使用。 首先是一堆进口商品: 和示例

  • 我需要将该模式格式提取到如下所示的治疗区域行项目:

  • 我的json结构如下: 表示JSON继续使用更多。我想从这个JSON中检索。我的代码如下所示: 但是,使用此代码,将始终 我尝试了不同的路径,但总是得到一个空的