Google bigquery 创建具有两列类型记录的表

Google bigquery 创建具有两列类型记录的表,google-bigquery,Google Bigquery,我正在使用大查询,我想创建一个用“记录”类型列填充表的作业。数据将由查询填充-是否可以创建具有两列类型记录的表 类似于BG公共数据集中的表[bigquery公共数据:samples.trigrams] 谢谢 控制查询作为记录输出的最简单方法是使用JavaScript UDF 例如: SELECT * FROM js( ( SELECT item FROM [fh-bigquery:wikidata.latest_raw] ), item, "[{name: 'id', type:'st

我正在使用大查询,我想创建一个用“记录”类型列填充表的作业。数据将由查询填充-是否可以创建具有两列类型记录的表

类似于BG公共数据集中的表[bigquery公共数据:samples.trigrams]


谢谢

控制查询作为记录输出的最简单方法是使用JavaScript UDF

例如:

SELECT *
FROM js(
(
  SELECT item
  FROM [fh-bigquery:wikidata.latest_raw] 
),
item,
"[{name: 'id', type:'string'},
  {name: 'sitelinks', type:'record', mode:'repeated', fields: [{name: 'site', type: 'string'},{name: 'title', type: 'string'},{name: 'encoded', type: 'string'}]},
  ]",
  "function(r, emit) {
    [...]
emit({
    id: obj.id,
    sitelinks: sitelinks,
    });  
  }")

请参阅。

上的完整示例。随着BigQuery标准SQL的引入,我们有了处理记录的简便方法
请尝试下面的操作,不要忘记取消选中“显示选项”下的“使用旧SQL”复选框

BigQuery遗留SQL中的类似结果可以通过以下代码实现:

SELECT *
FROM JS( 
  ( // input table 
  SELECT 
    a, GROUP_CONCAT(CONCAT(STRING(b), ';', STRING(c))) AS aa, 
    x, GROUP_CONCAT(CONCAT(STRING(y), ';', STRING(z))) AS xx
  FROM 
    (SELECT 1 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 1 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 2 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 2 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 13 AS x, 12 AS y, 13 AS z)
  GROUP BY a,x
  ), 
  a, aa, x, xx, // input columns 
  "[ // output schema 
  {name: 'a', type:'integer'},
  {name: 'aa', type:'record', mode:'repeated', 
  fields: [
    {name: 'b', type: 'integer'},
    {name: 'c', type: 'integer'}
    ]},
  {name: 'x', type:'integer'},
  {name: 'xx', type:'record', mode:'repeated', 
  fields: [
    {name: 'y', type: 'integer'},
    {name: 'z', type: 'integer'}
    ]}
   ]", 
  "function(row, emit) { // function 
    var aa = []; 
    aa1 = row.aa.split(',');
    for (var i = 0; i < aa1.length; i++) { 
      aa2 = aa1[i].split(';');
      aa.push({b:parseInt(aa2[0]), c:parseInt(aa2[1])}); 
    }; 
    var xx = []; 
    xx1 = row.xx.split(',');
    for (var i = 0; i < aa1.length; i++) { 
      xx2 = xx1[i].split(';');
      xx.push({y:parseInt(xx2[0]), z:parseInt(xx2[1])}); 
    };
    emit({
      a: row.a, 
      aa: aa, 
      x: row.x,
      xx: xx
      }); 
  }"
)  
选择*
来自JS(
(//输入表
挑选
a、 组_CONCAT(CONCAT(STRING(b),“;”,STRING(c)),作为aa,
x、 组_CONCAT(CONCAT(字符串(y),“;”,字符串(z))为xx
从…起
(选择1作为a,2作为b,3作为c,11作为x,12作为y,13作为z),
(选择1作为a,2作为b,3作为c,11作为x,12作为y,13作为z),
(选择2作为a,2作为b,3作为c,11作为x,12作为y,13作为z),
(选择2作为a,2作为b,3作为c,12作为x,12作为y,13作为z),
(选择3作为a,2作为b,3作为c,12作为x,12作为y,13作为z),
(选择3作为a,2作为b,3作为c,12作为x,12作为y,13作为z),
(选择3作为a,2作为b,3作为c,13作为x,12作为y,13作为z)
按a,x分组
), 
a、 aa,x,xx,//输入列
“[//输出架构
{name:'a',type:'integer'},
{名称:'aa',类型:'record',模式:'repeated',
字段:[
{name:'b',type:'integer'},
{name:'c',type:'integer'}
]},
{name:'x',type:'integer'},
{名称:'xx',类型:'record',模式:'repeated',
字段:[
{name:'y',type:'integer'},
{name:'z',type:'integer'}
]}
]", 
函数(行,发射){//函数
var aa=[];
aa1=行.aa.split(',');
对于(var i=0;i

要使其正常工作(对于旧式SQL),您需要设置目标表并选中“允许大结果”复选框和“取消锁定”复选框(全部在“显示选项”下)

谢谢!是否可以使用函数“NEST”?
SELECT *
FROM JS( 
  ( // input table 
  SELECT 
    a, GROUP_CONCAT(CONCAT(STRING(b), ';', STRING(c))) AS aa, 
    x, GROUP_CONCAT(CONCAT(STRING(y), ';', STRING(z))) AS xx
  FROM 
    (SELECT 1 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 1 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 2 AS a, 2 AS b, 3 AS c, 11 AS x, 12 AS y, 13 AS z),
    (SELECT 2 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 12 AS x, 12 AS y, 13 AS z),
    (SELECT 3 AS a, 2 AS b, 3 AS c, 13 AS x, 12 AS y, 13 AS z)
  GROUP BY a,x
  ), 
  a, aa, x, xx, // input columns 
  "[ // output schema 
  {name: 'a', type:'integer'},
  {name: 'aa', type:'record', mode:'repeated', 
  fields: [
    {name: 'b', type: 'integer'},
    {name: 'c', type: 'integer'}
    ]},
  {name: 'x', type:'integer'},
  {name: 'xx', type:'record', mode:'repeated', 
  fields: [
    {name: 'y', type: 'integer'},
    {name: 'z', type: 'integer'}
    ]}
   ]", 
  "function(row, emit) { // function 
    var aa = []; 
    aa1 = row.aa.split(',');
    for (var i = 0; i < aa1.length; i++) { 
      aa2 = aa1[i].split(';');
      aa.push({b:parseInt(aa2[0]), c:parseInt(aa2[1])}); 
    }; 
    var xx = []; 
    xx1 = row.xx.split(',');
    for (var i = 0; i < aa1.length; i++) { 
      xx2 = xx1[i].split(';');
      xx.push({y:parseInt(xx2[0]), z:parseInt(xx2[1])}); 
    };
    emit({
      a: row.a, 
      aa: aa, 
      x: row.x,
      xx: xx
      }); 
  }"
)