比诺嵌套json摄取

我有这个 json 模式

{
  "name":"Pete"
  "age":24,
  "subjects":[
    {
      "name":"maths"
      "grade":"A"
    },
    {
      "name":"maths"
      "grade":"B"
    }
  ]
}

我想将它提取到黑皮诺表中以运行类似的查询

select age,subjects_grade,count(*) from table group by age,subjects_grade

有没有办法在黑皮诺工作中做到这一点?

回答

Pinot 有两种方法来处理 JSON 记录:

1.在摄取期间展平记录:在这种情况下,我们将每个嵌套字段视为一个单独的字段,因此需要:

  • 在表架构中定义这些字段
  • 定义转换函数以展平表配置中的嵌套字段

请参阅下面如何定义列subjects_namesubjects_grade。由于它是一个数组,所以两个字段都是 Pinot 中的多值列。

2.直接摄取JSON记录

在这种情况下,我们将每个嵌套字段视为一个单独的字段,因此需要:

  • 将表架构中的 JSON 字段定义为具有 maxLength 值的字符串
  • 将此字段放入表配置中的noDictionaryColumnsjsonIndexColumns
  • 定义转换函数jsonFormat以字符串化表配置中的 JSON 字段

请参阅subjects_str下面的列是如何定义的。

下面是示例表架构/配置/查询:

示例皮诺模式:

{
  "metricFieldSpecs": [],
  "dimensionFieldSpecs": [
    {
      "dataType": "STRING",
      "name": "name"
    },
    {
      "dataType": "LONG",
      "name": "age"
    },
    {
      "dataType": "STRING",
      "name": "subjects_str"
    },
    {
      "dataType": "STRING",
      "name": "subjects_name",
      "singleValueField": false
    },
    {
      "dataType": "STRING",
      "name": "subjects_grade",
      "singleValueField": false
    }
  ],
  "dateTimeFieldSpecs": [],
  "schemaName": "myTable"
}

示例表配置:

{
    "tableName": "myTable",
    "tableType": "OFFLINE",
    "segmentsConfig": {
        "segmentPushType": "APPEND",
        "segmentAssignmentStrategy": "BalanceNumSegmentAssignmentStrategy",
        "schemaName": "myTable",
        "replication": "1"
    },
    "tenants": {},
    "tableIndexConfig": {
        "loadMode": "MMAP",
        "invertedIndexColumns": [],
        "noDictionaryColumns": [
            "subjects_str"
        ],
        "jsonIndexColumns": [
            "subjects_str"
        ]
    },
    "metadata": {
        "customConfigs": {}
    },
    "ingestionConfig": {
        "batchIngestionConfig": {
            "segmentIngestionType": "APPEND",
            "segmentIngestionFrequency": "DAILY",
            "batchConfigMaps": [],
            "segmentNameSpec": {},
            "pushSpec": {}
        },
        "transformConfigs": [
            {
                "columnName": "subjects_str",
                "transformFunction": "jsonFormat(subjects)"
            },
            {
                "columnName": "subjects_name",
                "transformFunction": "jsonPathArray(subjects, '$.[*].name')"
            },
            {
                "columnName": "subjects_grade",
                "transformFunction": "jsonPathArray(subjects, '$.[*].grade')"
            }
        ]
    }
}

示例查询:

select age, subjects_grade, count(*) from myTable GROUP BY  age, subjects_grade

select age, json_extract_scalar(subjects_str, '$.[*].grade', 'STRING') as subjects_grade, count(*) from myTable GROUP BY  age, subjects_grade

比较这两种方式,我们推荐方案1在字段密度高的时候将嵌套字段展平(例如每个文档都有字段名称等级,那么值得将它们提取出来作为新的列),它提供更好的查询性能和更好的存储效率。

方案二,配置更简单,适合稀疏字段(例如只有少数文档有特定字段)。它需要使用json_extract_scalar函数来访问嵌套字段。

另请注意 Pinot GROUP BY 在多值列上的行为。

更多参考:

黑皮诺柱变换

比诺 JSON 函数

黑比诺 JSON 索引

比诺多值函数


以上是比诺嵌套json摄取的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>