【问题标题】:Correct column name selections正确的列名选择
【发布时间】:2017-04-14 14:22:16
【问题描述】:
#standardSQL
SELECT
  blockchain.num_tx AS `num_tx`,
  blockchain.timestamp AS `timestamp`,
  GDELT.GLOBALEVENTID AS GLOBALEVENTID,
  PARSE_TIMESTAMP('%Y%m%d', CAST(GDELT.SQLDATE AS STRING)) AS SQLDATE,
  GDELT.Actor1Code AS Actor1Code,
  GDELT.Actor1Name AS Actor1Name,
  GDELT.Actor2Code AS Actor2Code,
  GDELT.Actor2Name AS Actor2Name,
  GDELT.AvgTone AS AvgTone,
  GDELT.SOURCEURL AS SOURCEURL
FROM
  w205_final_project.blockchain_data AS blockchain
INNER JOIN
  w205_final_project.GDELT AS GDELT
ON
  blockchain.timestamp = GDELT.SQLDATE

返回以下内容:

错误:对于参数类型的运算符 = 没有匹配的签名: 时间戳,INT64。支持的签名:ANY = ANY at [18:3]

GDELT.SQLDATE 列数据以整数格式开头,如YYYYMMDDblockchain.timestamp 列以timestamp 格式开头,例如:

2015-01-01 04:29:21 UTC     

【问题讨论】:

  • SQLDate 的类型是什么?你想用它做什么?
  • SQLDATE 最初是一个整数。那条线工作正常; sqldate 被转换为字符串,然后根据我的需要转换为时间戳。给我带来麻烦的是 blockchain.timestamp 行。我想在最后加入这两个时间戳格式的列(名为时间戳的列确实已经是时间戳格式)。
  • 显示错误信息!并展示GDELT.SQLDATEblockchain.timestamp 的几个示例 - 下面的链接可以帮助您 - 如何显示您遇到问题的代码的Minimal, Complete, and Verifiable exampleHow to Ask
  • 完成,谢谢,看来我没有成功地将 SQLDATE 转换为时间戳格式。请指教:)
  • operator = for argument types: TIMESTAMP, INT64 => 好的,这就是我在回答中解释的内容,您加入(INT) GDELT.SQLDATE 而不是您在选择中生成的(TIMESTAMP) GDELT.SQLDATE,所以加入不知道什么去做

标签: sql google-bigquery


【解决方案1】:

我不是 BigQuery 专家,但 SQLDAT(_PARSED) 是仅在此查询中加入后生成的字段,您不会在 join 子句中找到它为 SQLDATE(_PARSED)

您应该将GDELT.SQLDATE 切换为PARSE_TIMESTAMP('%Y%m%d', CAST(GDELT.SQLDATE AS STRING))

#standardSQL
SELECT
  blockchain.num_tx AS `num_tx`,
  blockchain.timestamp AS `timestamp`,
  GDELT.GLOBALEVENTID AS GLOBALEVENTID,
  PARSE_TIMESTAMP('%Y%m%d', CAST(SQLDATE AS STRING)) AS SQLDATE,
  GDELT.Actor1Code AS Actor1Code,
  GDELT.Actor1Name AS Actor1Name,
  GDELT.Actor2Code AS Actor2Code,
  GDELT.Actor2Name AS Actor2Name,
  GDELT.AvgTone AS AvgTone,
  GDELT.SOURCEURL AS SOURCEURL
FROM
  final_project.blockchain_data AS blockchain
INNER JOIN
  final_project.GDELT AS GDELT
ON
  blockchain.timestamp = PARSE_TIMESTAMP('%Y%m%d', CAST(GDELT.SQLDATE AS STRING))

第二点,不要将你的列命名为timestamp,它是一个 SQL 关键字,它是保留的,timedate、... 至少,尝试将你的别名重命名为类似 @ 987654330@created`

并避免将别名命名为与列相同的名称:

SELECT PARSE_TIMESTAMP('%Y%m%d', CAST(GDELT.SQLDATE AS STRING)) AS SQLDATE,
FROM blockchain_data AS blockchain
INNER JOIN GDELT 
    ON blockchain.timestamp = GDELT.SQLDATE;

不等于:

SELECT PARSE_TIMESTAMP('%Y%m%d', CAST(SQLDATE AS STRING)) AS SQLDATE_PARSED,
FROM blockchain_data AS blockchain
INNER JOIN GDELT 
    -- not what you want, but what you do, with error TIMESTAMP = INT64
    ON blockchain.timestamp = SQLDATE 
    -- what you want, but show ERROR column not fould
    ON blockchain.timestamp = SQLDATE_PARSED 
    -- Is the valid expression  
    ON blockchain.timestamp = PARSE_TIMESTAMP('%Y%m%d', CAST(SQLDATE AS STRING))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    相关资源
    最近更新 更多