我需要帮助通过 HIVE 查询从 JSON 检索子数组

I need help retrieving sub arrays from JSON with a HIVE query

我有以下 JSON.

{
    "_id": "00075602-f58d-49f5-8a82-9b5fb5582443",
    "ActivityCountedCollection": [{
        "Lesson": "98d66ab9-1ef4-4b61-a05d-857b3e07e0f8",
        "DataSet": 1,
        "DateTime": "2013-06-19T15:54:27.79+00:00",
        "ElapsedSeconds": 0.0000
    },
    {
        "Lesson": "Kindergarten - Play & Practice",
        "DataSet": 0,
        "DateTime": "2014-01-01T00:00:00",
        "ElapsedSeconds": 0.0,
        "Scores": [{
            "DataSet": 11,
            "Lesson": "c241ab4b-3d11-4aca-bb9b-a8a645c1e6ca",
            "ActivityNode": "ef2d4aae-08ad-48eb-a2e3-0ab616ef2e9c",
            "DateTime": "2013-07-01T15:31:11.81+00:00",
            "NumPossible": 2,
            "NumCorrect": 1,
            "Mastered": false
        },
        {
            "DataSet": 1,
            "Lesson": "01d6691f-911f-45b5-b861-778c725b4d98",
            "ActivityNode": "a2783eb1-873d-4ae7-bd58-6ab4bf48692c",
            "DateTime": "2013-07-08T15:09:54.61+00:00",
            "NumPossible": 5,
            "NumCorrect": 5,
            "Mastered": false
        }]
    }]
}       

我想检索 _ID 值,以及 ActivityCountedCollection 中的所有得分值。有些文档有分数,有些没有。

所以假设我的结果 table 会像这样:

  _ID,
  Lesson,
  DateTime,
  NumPossible,
  NumCorrect

我可以通过创建以下 table 并使用所述 json.

加载它来检索分数数组作为字符串
 CREATE EXTERNAL TABLE IF NOT EXISTS $ActivityCounted (
      id string,
      ActivityCountedcollection array<struct<
        Scores:array<string>
        >
      >
    )

但我想从分数数组中检索实际字段。我试过将分数作为字符串加载到 table 中,然后再次展开它们,但相信由于它不知道它们是单独的字段,并且存在于字符串字段中,因此无法检索它们。 所以我尝试重新创建 table 以包含子数组。

 CREATE EXTERNAL TABLE IF NOT EXISTS $ActivityCounted (
      id string,
      ActivityCountedcollection array<struct<
        Scores:array<struct<
          Skill:string,
          Lesson:string,
          DateTime:timestamp,
          NumPossible:int,
          NumCorrect:int,
          Mastered:string
          > >
        >
      >
    )

但这也不行。

我有另一个例子,它不是一个复杂的字段数组,我能够将它提取到 table,将数组粘贴到 table,然后展开 [=31] =] 再次提取单个值。但是要再次爆炸并从数组中提取多个字段,我很难过。

我已确定生成此请求中的结果所需的代码