spark动态地将json解析成键值字符串

envsm3lx  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(382)

我正在尝试将一个通用的json动态地转换成键值字符串(至少3级嵌套)。e、 g:json:

{
    "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”)加载spark
它将key作为json文件名,将json字符串作为值,现在我不知道如何解析json字符串并将其转换为包含key-value结构的字符串列表。另外,要处理不同的模式json ata时间,比如在pairdd中,我们有键作为文件名,值作为jsonstring,所以每个jsonstring都应该转换为该特定文件名的键值,如果有任何想法,请告诉我怎么做

3xiyfsfu

3xiyfsfu1#

检查这篇文章的扁平列,我正在使用 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)

相关问题