【问题标题】:Spark Dynamically Json Parsing into key value stringsSpark动态Json解析成键值字符串
【发布时间】:2021-02-27 08:00:21
【问题描述】:

我正在尝试将通用 json 动态转换为键值字符串(至少 3 级嵌套)。 例如: 杰森:

{
    "a": {
        "d": "1",
        "e": "2",
        "f": "3",
        "g": {
            "h": [{
                "i": "4",
                "j": "5",
                "k": "6",
                "l": true,
                "m": true,
                "n": 1821,
                "o": false
            }, {
                "i": "7",
                "g": "8",
                "l": false,
                "m": false,
                "o": false
            }]
        },
        "l": false
    },
    "b": {
        "p": {
            "q": {
                "h": [{
                    "i": "7",
                    "g": "8",
                    "l": false,
                    "m": false,
                    "o": false,
                    "r": "FALSE"
                }, {
                    "i": "4",
                    "j": "5",
                    "k": "6",
                    "l": true,
                    "m": true,
                    "n": 1821,
                    "o": false,
                    "r": "FALSE"
                }]
            }
        },
        "s": [{
            "t": {
                "u": ["xxx:*"],
                "v": "333",
                "w": "10"
            }
        }],
        "x": [{
            "y": "DEFAULT"
        }]
    },
    "c": {
        "z": "100",
        "zz": "2020-11-06T07:15:25.836Z"
    }
}

结果:键值字符串类似于:

a.d=1
a.e=2
a.f=3
a.g.h.i=4
a.g.h.j=5
a.g.h.k=6
a.g.h.l=True
a.g.h.m=True
a.g.h.n=1821
a.g.h.o=False
a.g.h.i=7
a.g.h.g=8
a.g.h.l=False
a.g.h.m=False
a.g.h.o=False
a.l=False
b.p.q.h.i=7
b.p.q.h.g=8
b.p.q.h.l=False
b.p.q.h.m=False
b.p.q.h.o=False
b.p.q.h.r=FALSE
b.p.q.h.i=4
b.p.q.h.j=5
b.p.q.h.k=6
b.p.q.h.l=True
b.p.q.h.m=True
b.p.q.h.n=1821
b.p.q.h.o=False
b.p.q.h.r=FALSE
b.s.t.u=["xxx:*"]
b.s.t.v=333
b.s.t.w=10
b.x.y=DEFAULT
c.z=100
c.zz=2020-11-06T07:15:25.836Z

这里的键可能是任何东西,所以不能使用键的硬编码字符串值来解析。 我尝试通过 rdd = spark.sparkContext.wholeTextFiles("s3:///jsontest/*.json")

这给了我作为 json 文件名和 json 字符串作为值的键,现在我不知道如何解析 json 字符串并将其转换为包含键值结构的字符串列表。 此外,想要在pairRDD中处理不同的模式json,我们将键作为文件名,将值作为jsonstring,所以每个jsonstring都应该只转换为该特定文件名的键值 让我知道我该怎么做

【问题讨论】:

  • 你用的是python还是scala?
  • 任何语言都可以使用 python、scala 或 java
  • 您可以查看此帖子 - stackoverflow.com/questions/61863489/… 并根据您的要求进行更改
  • 这有帮助,但它为我提供了表格格式的所有数据,而不是键值类型,我的意思是我的表中只有两列(键,值)我认为在此之后转置会有所帮助,任何想法?
  • 获得表格格式后,您可以将这些列移动到地图中,您将获得数据作为键、值。

标签: json scala apache-spark parsing pyspark


【解决方案1】:

Check this post for flatten columns,我正在使用该帖子中的explodeColumns

使用json函数读取所有json文件,然后使用explodeColumns

val df = spark.read.json("/your/json/directory/").explodeColumns

要获取键值对中的数据,请检查以下代码。

df.select(map(df.columns.flatMap(c => Seq(lit(c),col(c))):_*).as("map")).show(false)

【讨论】:

  • 我收到一些数据类型不匹配错误:由于数据类型不匹配:函数映射的给定值应该都是相同的类型,但它们是 [string, string, string, string, string, bigint, string, boolean, string, boolean, boolean, string, boolean, string, string, string, string, bigint, string, string, boolean, string, boolean, boolean, string];还有一件事是我可以用生成的密钥映射文件名。
  • 是的,地图应该包含相同的数据类型。我认为你必须将所有数据类型转换为字符串。
猜你喜欢
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2013-05-18
  • 2018-12-25
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多