google-bigquery - 如何选择没有别名的 bigquery 表的第 n 列?
问题描述
sh-3.2$ bq shell
Welcome to BigQuery! (Type help for more information.)
bqaccount> select 1;
Waiting on bqjob_r42d56b0f0c2a3eb9_00000164b439b383_1 ... (0s) Current status: DONE
+-----+
| f0_ |
+-----+
| 1 |
+-----+
bqaccount> select f0_ from (select 1);
Error in query string: Error processing job 'bqaccount:bqjob_r7d8d3d2925de7c0c_00000164b439def3_1': Unrecognized name: f0_ at [1:8]
有没有办法从没有别名的查询中选择特定列?
解决方案
BigQuery 旧版 SQL 可以引用 fn_
#legacySQL
SELECT f2_, f0_, f1_
FROM (SELECT 1, 2, 3)
结果是
Row f2_ f0_ f1_
1 3 1 2
不过,BigQuery 标准 SQL 似乎不支持它
因此,以下是 BigQuery 标准 SQL 的一种解决方法
#standardSQL
SELECT
cols[OFFSET(0)],
cols[OFFSET(1)],
cols[OFFSET(2)],
cols[OFFSET(3)],
cols[OFFSET(4)]
FROM (SELECT 1, 2, 3, 'abc', CURRENT_DATE()) t,
UNNEST([
STRUCT<cols ARRAY<STRING>>(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"[^"]?":"?(\w*)"?'))
])
或相同方法的另一个版本(无论你会发现什么更适合你)
#standardSQL
SELECT
cols[OFFSET(0)],
cols[OFFSET(1)],
cols[OFFSET(2)],
cols[OFFSET(3)],
cols[OFFSET(4)]
FROM (
SELECT REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"[^"]?":"?(\w*)"?') cols
FROM (SELECT 1, 2, 3, 'abc', CURRENT_DATE()) t
)
结果
Row f0_ f1_ f2_ f3_ f4_
1 1 2 3 abc 2018
推荐阅读
- python - 在pyspark中过滤RDD时如何进行2次测试?
- python - 刽子手相同的字符错误
- node.js - Nodejs 并不总是显示错误
- angular - Angular auth 保护嵌套异步调用
- google-cloud-platform - App Engine Flex 中的 GOOGLE_APPLICATION_CREDENTIALS
- kubernetes - 如何定义 Pod 接收请求的阈值(在 Kubernetes 环境中)
- jquery - 如何将复选框 id 从 HTML 传递到 JQuery?
- python - BeautifulSoup 的 find_all 方法进入循环
- django - 从 Django 模型序列化器中排除具有外键关系的特定模型字段
- java - 为没有字段的类创建构造函数