如何重命名 DataFrame 中与嵌套 JSON 对应的字段

2023-12-05

我正在尝试使用以下方法处理移动应用程序中收到的 JSON 事件(如点击等)spark 1.5.2。有多个应用程序版本,并且事件的结构因版本而异。

假设版本 1 具有以下结构:

{
    "timestamp": "",
    "ev": {
                "app": {
                    "appName": "XYZ",
                    "appVersion": "1.2.0"
                }
                "device": {
                    "deviceId": "ABC",
                    ...
                }
                ...
             }
}

另一个版本的结构如下:

{
    "timestamp": "",
    "ev": {
                "_a": {
                    "name": "XYZ",
                    "version": "1.3.0"
                }
                "_d": {
                    "androidId": "ABC",
                    ...
                }
                ...
             }
}

我希望能够为结构创建单个数据框并执行一些查询。

我正在使用以下方法为每个结构创建两个不同的数据框filter功能。现在我需要能够重命名列以对两个数据帧执行联合操作。

我在用:

df.withColumnRenamed("ev.app", "ev._a").withColumnRenamed("ev.device", "ev._d");

但这是行不通的。我该如何实现这一目标?


如果只是重命名嵌套列而不是更改模式结构,那么替换 DataFrame 模式(使用新模式重新创建 DataFrame)就可以了。

object functions {

  private def processField(structField: StructField, fullColName: String, oldColName: String, newColName: String): StructField = {
    if (fullColName.equals(oldColName)) {
      new StructField(newColName, structField.dataType, structField.nullable)
    } else if (oldColName.startsWith(fullColName)) {
      new StructField(structField.name, processType(structField.dataType, fullColName, oldColName, newColName), structField.nullable)
    } else {
      structField
    }
  }

  private def processType(dataType: DataType, fullColName: String, oldColName: String, newColName: String): DataType = {
    dataType match {
      case structType: StructType =>
        new StructType(structType.fields.map(
          f => processField(f, if (fullColName == null) f.name else s"${fullColName}.${f.name}", oldColName, newColName)))
      case other => other
    }
  }

  implicit class ExtDataFrame(df: DataFrame) {
    def renameNestedColumn(oldColName: String, newColName: String): DataFrame = {
      df.sqlContext.createDataFrame(df.rdd, processType(df.schema, null, oldColName, newColName).asInstanceOf[StructType])
    }
  }
}

Usage:

scala> import functions._
import functions._

scala> df.printSchema
root
 |-- geo_info: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- country_code: string (nullable = true)
 |    |-- state: string (nullable = true)
 |    |-- region: string (nullable = true)

scala> df.renameNestedColumn("geo_info.country_code", "country").printSchema
root
 |-- geo_info: struct (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- country: string (nullable = true)
 |    |-- state: string (nullable = true)
 |    |-- region: string (nullable = true)

这个实现是递归的,所以它也应该处理这样的情况:

df.renameNestedColumn("a.b.c.d.e.f", "bla")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重命名 DataFrame 中与嵌套 JSON 对应的字段 的相关文章

随机推荐

  • Pentaho reportviewer URL 未在 iframe 中加载

    我是 pentaho 新手 我尝试在我使用的 iframe 中使用 pentaho reportviewer 显示报告 prpt文件来加载报告 我在 iframe 中使用了以下网址 http 172 20 10 30 8080 pentah
  • 在 AVD 上运行 SIP 演示 Android 平台 2.3

    Android 2 3平台包含一个SIP演示项目 我想在两个 AVD 上测试这个项目 而不是在真正的 Android 设备上 我真的不知道如何继续 From 测试 SIP 应用程序 测试 SIP 应用程序 要测试 SIP 应用程序 您需要以
  • Python在方法内使用tkinter显示变量

    我刚刚编写的程序是我了解 Tkinter 工作原理的游乐场 我的问题是如何将变量 timelabel 显示为标签 我已经制作了一个名为 时间刷新 的标签 但它没有显示 我知道 DigitalClock 类的编写效率不高 我是新来的 def
  • 在 C 或 C++ 中以编程方式删除非空目录

    如何在C或C 中删除非空目录 有什么功能吗 rmdir 只删除空目录 请提供一种不使用任何外部库的方法 还告诉我如何用 C 或 C 删除文件 您想要编写一个函数 递归函数是最简单的 但很容易耗尽深层目录上的堆栈空间 来枚举目录的子目录 如果
  • 具有扩展密钥用法的证书仅适用于 Firefox

    我尝试为多个域的服务器生成自签名证书 我在 v3 req 扩展中使用了 openssl 我使用此命令行生成具有多个域和扩展密钥用法的证书 openssl x509 req days 3650 in san domain com csr si
  • atexit 函数的目的是什么?

    我知道函数的地址何时传递给atexit功能 该函数被执行 include
  • 如何在 aws emr 上使用 -libjars?

    Stack Overflow 上有类似的问题 但没有一个回答这个问题 当按照以下链接时出现问题http grepalex com 2013 02 25 hadoop libjars 我们需要使用 export HADOOP CLASSPAT
  • 是否有 OutputDebugString 的 Unicode 替代品?

    OutputDebugString 是原生 ASCII 这意味着它在调用 ASCII 版本之前将输入的 Unicode 字符串转换为本地字符串OutputDebugStringA 有没有什么替代方案OutputDebugString 哪个支
  • .htaccess RewriteRule 有效,但地址栏中的 URL 没有变化?

    我一直在抓着头发试图解决这个问题 但没有任何效果 我有一个网页位于mysite com test php我想做一个简单的 URL 重写并将其更改为mysite com testRewrite 实现这一点的代码应该是 Options Foll
  • 如何将包导入 Scala REPL?

    如何将包导入 Scala 的 REPL 中 我正在尝试导入这个名为 funsets 的包 它有一个名为 FunSets 的对象 我尝试了几种变体import funsets and import funsets 等等 但它仍然没有导入包中的
  • Android后台服务和警报

    最近遇到一个问题Android 4 4杀死了我的应用程序Service and AlarmManager当设备进入睡眠模式时 START STICKY参数没有帮助 我尝试了很多东西 但没有任何效果符合我的需要 在我的任务管理器应用程序中 我
  • 在 OCaml 中打破循环

    我经常需要在 OCaml 中打破循环 至少有两种方法 by exception try for i 0 to 100 do if cond then raise BreakLoop done with BreakLoop gt by whi
  • SQL 按字母顺序排序,小于 10 的数字不带前导零

    是否可以按以下方式在 mySQL 中按字母顺序排序 A1 A2 A3 A5 A10 A11 A20 A23 A24 不幸的是 我收到的订单如下所示 请注意 A10 之前的任何数字如何没有组合在一起 A1 A10 A11 A12A2 A20
  • 由于 AccessibilityNodeInfo getChild 导致出现大量 ANR

    收到大量 ANR 报告 main prio 5 tid 1 可运行 组 主 sCount 0 dsCount 0 标志 0 obj 0x72e8a568 自我 0xe65da000 sysTid 20592 好 0 cgrp 默认调度 0
  • 对 Intellij 如何编译事物和处理资源感到困惑

    我对 Visual Studio 的 IntelliJ 非常陌生 而且我通常对资源文件在 IntelliJ 项目中的工作方式感到非常困惑 我阅读了一些有关将资源添加到类路径以及 IntelliJ 文档的问题和解答 但仍然感到困惑 我还有几个
  • 在 R Markdown 中使用 pandoc 和 bookdown 删除图标题中的冒号

    我正在更改 R Markdown 中图形标题的字体并使用bookdown和 pandoc 这样做 我的问题与以下问题密切相关 如何更改bookdown中的图形标题格式 我能够获得正确的图形编号 并且能够更改标题的 图 1 部分的格式 但是
  • 是否可以从 adf 连接到 databricks deltalake 表

    我正在寻找一种能够从 ADF 和其他 Azure 服务 如数据目录 连接到 Databricks deltalake 表的方法 我没有看到 ADF 数据源中列出的 databricks 数据存储 关于类似的问题 是否可以从 Azure 数据
  • 如何从jni端调用java方法?

    我在 jni 端完成了一些 C 代码函数 并且所有工作正常 public native String getMessage 函数将字符串从 jni 端返回到 java 端 它工作正常 所有其他 jni 代码也工作正常 但问题是如何在 jni
  • 使用 Python 刷新 Excel 外部数据

    我有一个 Excel 文件 我在其上运行 Python 脚本 Excel 文件具有需要在运行 Python 脚本之前刷新的外部数据连接 我指的功能在这里 我使用的是 Python 2 7 并且依靠 Pandas 进行大部分 Excel 数据
  • 如何重命名 DataFrame 中与嵌套 JSON 对应的字段

    我正在尝试使用以下方法处理移动应用程序中收到的 JSON 事件 如点击等 spark 1 5 2 有多个应用程序版本 并且事件的结构因版本而异 假设版本 1 具有以下结构 timestamp ev app appName XYZ appVe