查询实木复合地板记录中的嵌套数组

pg2*_*g20 2 hiveql apache-spark parquet apache-spark-sql spark-dataframe

我正在尝试以不同的方式查询记录数组中的记录并将完整的Row显示为输出。

我不知道哪个嵌套对象具有字符串“ pg”。但是我想查询特定的对象。对象是否具有“ pg”。如果“ pg”存在,那么我想显示该完整行。如何在不指定对象索引的情况下在嵌套对象上写“ spark sql query”。所以我不想使用children.name的索引

我的Avro记录:

{
"name": "Parent",
"type":"record",
"fields":[
    {"name": "firstname", "type": "string"},

    {
        "name":"children",
        "type":{
            "type": "array",
            "items":{
                        "name":"child",
                        "type":"record",
                        "fields":[
                            {"name":"name", "type":"string"}
                        ]
                    }
            }
    }
]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Spark SQL上下文查询读取的数据框。所以如果输入是

Row no   Firstname Children.name
    1    John       Max
                    Pg
    2    Bru        huna
                    aman
Run Code Online (Sandbox Code Playgroud)

输出应该返回poq 1,因为它有一行,其中childs.name的一个对象是pg。

val results = sqlc.sql("SELECT firstname, children.name FROM nestedread where children.name = 'pg'")
results.foreach(x=> println(x(0), x(1).toString))
Run Code Online (Sandbox Code Playgroud)

上面的查询不起作用。但是当我查询children [1] .name时,它可以工作。

我也想知道,如果我可以过滤一组记录然后爆炸。而不是先爆炸并创建大量行,然后进行过滤。

Yua*_* JI 5

看来你可以用

org.apache.spark.sql.functions.explode(e: Column): Column
Run Code Online (Sandbox Code Playgroud)

例如在我的项目(在Java中)中,我嵌套了json,如下所示:

{
    "error": [],
    "trajet": [
        {
            "something": "value"
        }
    ],
    "infos": [
        {
            "something": "value"
        }
    ],
    "timeseries": [
        {
            "something_0": "value_0",
            "something_1": "value_1",
            ...
            "something_n": "value_n"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想分析“时间序列”中的数据,所以我做了:

DataFrame ts = jsonDF.select(org.apache.spark.sql.functions.explode(jsonDF.col("timeseries")).as("t"))
                     .select("t.something_0",
                             "t.something_1",
                             ...
                             "t.something_n");
Run Code Online (Sandbox Code Playgroud)

我也很新。希望这可以给您提示。