Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 嵌套重复上的bigquery连接_Google Bigquery_Google Cloud Platform - Fatal编程技术网

Google bigquery 嵌套重复上的bigquery连接

Google bigquery 嵌套重复上的bigquery连接,google-bigquery,google-cloud-platform,Google Bigquery,Google Cloud Platform,我在连接重复的嵌套字段时遇到问题,同时仍然保留BigQuery中的原始行结构 在我的示例中,我将调用正在连接的两个表A和B 表A中的记录类似于: { "url":"some url", "repeated_nested": [ {"key":"some key","property":"some property"} ] } { "key":"some key", "property2": "another property" } 表B中的记录类似于: { "

我在连接重复的嵌套字段时遇到问题,同时仍然保留BigQuery中的原始行结构

在我的示例中,我将调用正在连接的两个表
A
B

表A中的记录类似于:

{
  "url":"some url",
  "repeated_nested": [
    {"key":"some key","property":"some property"}
  ]
}
{
  "key":"some key",
  "property2": "another property"
}
表B中的记录类似于:

{
  "url":"some url",
  "repeated_nested": [
    {"key":"some key","property":"some property"}
  ]
}
{
  "key":"some key",
  "property2": "another property"
}
我希望找到一种方法将这些数据连接在一起,生成一行,如下所示:

{
  "url":"some url",
  "repeated_nested": [
    {
      "key":"some key",
      "property":"some property",
      "property2":"another property"
    }
  ]
}
我尝试的第一个问题是:

SELECT 
  url, repeated_nested.key, repeated_nested.property, repeated_nested.property2
FROM A
  AS lefttable
LEFT OUTER JOIN B
  AS righttable
  ON lefttable.key=righttable.key
这不起作用,因为BQ不能在重复的嵌套字段上联接。每行没有唯一的标识符。如果我要对
重复嵌套的
执行
展平
,那么我不确定如何将原始行正确地放回一起

数据是这样的:
url
将始终具有相同的
重复\u嵌套的
字段。因此,我能够使用UDF进行变通,将重复的嵌套对象汇总到JSON字符串中,然后再次展开:

SELECT url, repeated_nested.key, repeated_nested.property, repeated_nested.property2

FROM
JS(
   (
    SELECT basetable.url as url, repeated_nested
    FROM A as basetable

    LEFT JOIN (
      SELECT url, CONCAT("[", GROUP_CONCAT_UNQUOTED(repeated_nested_json, ","), "]") as repeated_nested
      FROM
      (
        SELECT
          url,
            CONCAT(
              '{"key": "', repeated_nested.key, '",',
              ' "property": "', repeated_nested.property, '",',
              ' "property2": "', mapping_table.property2, '"',
              '}'
            )
          ) as repeated_nested_json
        FROM (
          SELECT
            url, repeated_nested.key, repeated_nested.property
          FROM A
          GROUP BY url, repeated_nested.key, repeated_nested.property
        ) as urltable

         LEFT OUTER JOIN [SDF.alchemy_to_ric]
            AS mapping_table
            ON urltable.repeated_nested.key=mapping_table.key
      )
      GROUP BY url
    ) as companytable
    ON basetable.url = urltable.url
  ),

  // input columns:
  url, repeated_nested_json,

  // output schema:
  "[{'name': 'url', 'type': 'string'},
   {'name': 'repeated_nested_json', 'type': 'RECORD', 'mode':'REPEATED', 'fields':
    [ { 'name': 'key', 'type':'string' },
      { 'name': 'property', 'type':'string' },
      { 'name': 'property2', 'type':'string' }]
   }]",

  // UDF:
  "function(row, emit) {
    parsed_repeated_nested = [];
    try {
      if ( row.repeated_nested_json != null ) {
          parsed_repeated_nested = JSON.parse(row.repeated_nested_json);
      }
    } catch (ex) { }

    emit({
      url: row.url,
      repeated_nested: parsed_repeated_nested
    });
  }"
)
此解决方案适用于小桌子。但是我正在处理的现实生活中的表比我上面的示例中有更多的列。当除了
url
repeated\u nested\u json
之外还有其他字段时,它们都必须通过UDF传递。当我使用50 gb左右的表时,一切都很好。但是当我将UDF和查询应用于500-1000GB的表时,我从BQ得到一个内部服务器错误

最后,我只需要GCS中所有新行分隔JSON格式的数据。作为最后的努力,我尝试将所有字段连接成一个JSON字符串(因此我只有一列),希望能够将其导出为CSV并获得所需的内容。但是,导出过程跳过了双引号,并在JSON字符串周围添加了双引号。根据作业()上的BQ文档,有一个属性
configuration.query.tableDefinitions.(key.csvOptions.quote
,可以帮助我。但我不知道如何让它工作


有人对他们如何处理这种情况有什么建议吗?

我从来没有这样做过,但你应该能够使用
展平
,然后加入,然后使用
嵌套
再次获取重复字段

文档声明BigQuery总是展平查询结果,但这似乎是错误的:如果设置了目标表,则可以选择不展平结果。然后,您应该能够将该表作为JSON导出到存储


另请参见如何使
nest
正常工作。

@AndrewBackes-本周我们推出了一些针对UDF内存相关问题的修复方案;这里和这里都有一些关于根本原因的细节


您查询的UDF版本现在适用于我;您是否可以验证?

“BQ的内部服务器错误”-请出示工作证,以便团队能够investigate@FelipeHoffasharethis.com:quixotic-spot-526:bquijob\u 39502947\u 1535e1c5f59一个棘手的细节:没有干净的方法可以使用
NEST
取回重复记录——您只能在叶字段上使用
NEST
取回单个重复记录。为了解决这个问题,你可以考虑把记录记录到一个字符串中(如问题中提到的),使用<代码> Nest 将它恢复到一个重复的字段,然后使用UDF来打开记录。BTW,我们对SQL语言的改进很快就会使所有这些变得容易得多。跟随以获得通知。此外,
NEST
必须与
分组依据一起使用。在我的例子中,我还没有能够编造一个字段来使用上的
groupby
。Jeremy-带有UDF方法的打包/解包json实际上是最接近工作解决方案的。然而,当我在500gb-1000gb的表中使用它时,BQ的响应是:“内部服务器错误”Andrew,那么
url
呢?如果这不是每行唯一的,您可以(在
展平
之前)使用
row\u number()over()
创建一个唯一的列。