从日志表和参考表在 Big Query 中创建新表

Posted

技术标签:

【中文标题】从日志表和参考表在 Big Query 中创建新表【英文标题】:Creating a New Table in Big Query from a log table and a reference table 【发布时间】:2017-04-27 22:13:38 【问题描述】:

我是大查询的新手,需要创建一个烫发。来自日志文件和参考表的表。我是新手,做错了什么,但不知道为什么。请帮忙。

日志文件(示例)

-Event_Time,User_ID,Type

-1/1/2017,123_abc,a

-1/2/2017,123_bcd,b

-1/2/2017,123_abc,c

参考表(示例)

-类型合作伙伴

-a 1

-b 2

-c 3

-d 3

create table workarea.SummaryTable AS (
User_ID string,
TotalCount integer,
imps_time timestamp,
Partner integer)

insert into workarea.SummaryTable
select distinct User_ID,
COUNT(*) as TotalCount,
MIN(TIME) as imps_time,
SUM(case when Partner = '1' then 1 else 0 end) as 1,
SUM(case when Partner = '2' then 1 else 0 end) as 2,
SUM(case when Partner = '3' then 1 else 0 end) as 3

from workarea.logfile i
join workarea.referencetable r on i.Type=r.Type
where CID=10848805 
group by USER_ID

【问题讨论】:

【参考方案1】:

.. 做错了什么,但不知道为什么

到目前为止,我已经确定了以下故障点

    CREATE TABLE 语句在 BigQuery 中不可用Data Manipulation Language 仅允许您使用 INSERTDELETEUPDATE

您需要有表pre-created,然后才能在其中操作/插入数据

    别名不能以数字开头 -

所以下面的片段不正确

SUM(CASE WHEN Partner = '1' THEN 1 ELSE 0 END) AS 1,    
SUM(CASE WHEN Partner = '2' THEN 1 ELSE 0 END) AS 2,    
SUM(CASE WHEN Partner = '3' THEN 1 ELSE 0 END) AS 3    

你应该使用类似的东西

SUM(CASE WHEN Partner = '1' THEN 1 ELSE 0 END) AS Partner_1,    
SUM(CASE WHEN Partner = '2' THEN 1 ELSE 0 END) AS Partner_2,    
SUM(CASE WHEN Partner = '3' THEN 1 ELSE 0 END) AS Partner_3    

    某些字段看起来在引用的表中不存在,但您在最终查询中使用它们:MIN(time) as imps_time 中的timeWHERE CID=10848805 中的CID

    目标表的架构有 4 个字段 - 而 select 语句的架构有 6 个字段。你应该清除这个!他们必须匹配!

可能的“解决方案”(BigQuery 标准 SQL)

我假设(只是为了在这里取得一些进展)您的目标表的架构实际上如下所示

User_ID STRING,
TotalCount INT64,
imps_time TIMESTAMP,
Partner_1 INT64,
Partner_2 INT64,
Partner_3 INT64

在这种情况下 - 下面的查询应该产生正确的插入结果

#standardSQL
SELECT 
  User_ID,
  COUNT(*) AS TotalCount,
  MIN(Event_Time) AS imps_time,
  SUM(CASE WHEN Partner = '1' THEN 1 ELSE 0 END) AS Partner_1,
  SUM(CASE WHEN Partner = '2' THEN 1 ELSE 0 END) AS Partner_2,
  SUM(CASE WHEN Partner = '3' THEN 1 ELSE 0 END) AS Partner_3
FROM `workarea.logfile` i
JOIN `workarea.referencetable` r ON i.Type=r.Type
-- WHERE CID=10848805 
GROUP BY USER_ID

【讨论】:

以上是关于从日志表和参考表在 Big Query 中创建新表的主要内容,如果未能解决你的问题,请参考以下文章

mysql事务表和非事务表在binlog日志的不同处理

MySQL创建临时表-旧表建新表

Big Query 不允许创建表

在SQL Server中创建标识表和开发项目表

linux静态路由表和动态路由表在内核吗

从两个表在 mysql 中创建 VIEW