2017-04-14 90 views
1
#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 

返回以下:正确的列名的选择

Error: No matching signature for operator = for argument types: TIMESTAMP, INT64. Supported signature: ANY = ANY at [18:3]

GDELT.SQLDATE列数据是,首先,作为YYYYMMDD整数格式; blockchain.timestamp列是timestamp格式开始,例如:

2015-01-01 04:29:21 UTC  
+0

什么是SQLDate的类型?你想用它做什么? –

+0

SQLDATE最初是一个整数。该线路正常工作; sqldate被转换为字符串,然后根据需要转换为时间戳。这是blockchain.timestamp行,给我带来麻烦。我想结束这两个时间戳格式化的列(名为时间戳的列确实已经是时间戳格式)。 –

+0

显示错误信息!并显示'GDELT.SQLDATE'和'blockchain.timestamp'的几个例子 - 下面的链接可以帮助你 - 如何显示[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve)代码,你有问题和[如何问](http://stackoverflow.com/help/how-to-ask)。 –

回答

2

我不是一个专家的BigQuery,但SQLDAT(_PARSED)只有经过此查询的连接产生的场,你会找不到它在join条款SQLDATE(_PARSED)

你应该切换您GDELT.SQLDATEPARSE_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,......至少,尝试你的别名重命名为类似blockchain.timestamp AS 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))