如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数
Posted
技术标签:
【中文标题】如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数【英文标题】:How to use Bigquery JSON functions in Google Cloud Datalab 【发布时间】:2016-07-15 10:49:14 【问题描述】:我在 Google Cloud Datalab 笔记本中调用 Bigquery,我想使用 JSON functions that can be used in BigQuery。然而事实证明,因为 JSON 函数使用“$”作为对字符串中段的引用,而 Cloud Datalab 使用“$”来引用全局变量;它们发生冲突并给出错误。
示例(无法重现,因为我在示例中找不到任何类似 JSON 的字符串)
%%sql --module events_query
SELECT JSON_EXTRACT_SCALAR(eventTypeParams, '$.restaurant-name") as str
FROM [foodit-prod:analytics.analytics_event]
当我运行这个东西时:
events_run = bq.Query(events_query)
events = events_run.to_dataframe()
这是我收到的错误:
ExceptionTraceback(最后一次调用) 在 () ----> 1 events_run = bq.Query(events_query) 2 个事件 = events_run.to_dataframe()
/usr/local/lib/python2.7/dist-packages/gcp/bigquery/_query.pyc init(self, sql, context, values, udfs, data_sources, **kwargs) 90 个值 = kwargs 91 ---> 92 self._sql = gcp.data.SqlModule.expand(sql, values, udfs) 93 94 # 我们需要注意不要包含两次相同的 UDF 代码,所以我们使用集合。
/usr/local/lib/python2.7/dist-packages/gcp/data/_sql_module.pyc 展开(sql、args、udfs) 第127章 128 sql,args = SqlModule.get_sql_statement_with_environment(sql,args) --> 129 返回 _sql_statement.SqlStatement.format(sql._sql, args, udfs) 130 131
/usr/local/lib/python2.7/dist-packages/gcp/data/_sql_statement.pyc 在 格式(sql、args、udfs) 137 代码 = [] 第138章 --> 139 已解决_vars=已解决_vars) 140 141 # 重建 SQL 字符串,仅用 '$' 替换转义的 $,
/usr/local/lib/python2.7/dist-packages/gcp/data/_sql_statement.pyc 在 _find_recursive_dependencies(sql,值,代码,resolved_vars,resolving_vars) 80 81 # 获取该 SQL 中的 $var 引用集。 ---> 82 个依赖项 = SqlStatement._get_dependencies(sql) 83 用于依赖项中的依赖项: 84 # 现在我们检查每个依赖项。如果它是完整的 - 即我们有一个扩展
/usr/local/lib/python2.7/dist-packages/gcp/data/_sql_statement.pyc _get_dependencies(sql) 202 依赖项.附加(变量) 203 美元: --> 204 raise Exception('Invalid sql; $ with no following $ or identifier: %s.' % sql) 205 返回依赖 206
异常:无效的 sql; $ 后面没有 $ 或标识符:SELECT JSON_EXTRACT_SCALAR(eventTypeParams, "'\$'.restaurant-name") as str FROM [foodit-prod:analytics.analytics_event]。
我尝试将 $ 符号放在不同的引号中或转义等。没有奏效。有什么解决办法吗?
【问题讨论】:
【参考方案1】:您可以尝试以下方法吗?
%%sql
SELECT JSON_EXTRACT_SCALAR(
"'book':
'category':'fiction',
'title':'Harry Potter'",
"$$.book.category");
或者从你的例子中,
%%sql --module events_query
SELECT JSON_EXTRACT_SCALAR(eventTypeParams, '$$.restaurant-name') as str
FROM [foodit-prod:analytics.analytics_event]
【讨论】:
这行得通,非常感谢!但它仍然很糟糕,因为您不能直接从 BigQuery 或文件中复制粘贴代码。您必须添加额外的 $ 符号。我尝试在 BQ 中使用双 $$ 但这在那里不起作用。所以我们会对同一家公司的产品有不同的语法,这有点奇怪:) 我在 Google Datalab 中使用 UDF 时遇到了类似的问题。如果它解决了您的问题,请将此答案标记为已接受 作为一种在 BQ 和 Datalab 之间保持查询相同的解决方法,您可以创建自己的 gcp.bigquery 包装函数,该函数会自动在 SQL 字符串中添加额外的$
以上是关于如何在 Google Cloud Datalab 中使用 Bigquery JSON 函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google Cloud Datalab 时如何将 .gz 文件加载到 BigQuery?
从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?
如何使用 R 将 Google Cloud Datalab 输出保存到 BigQuery
如何使用R将Google Cloud Datalab输出保存到BigQuery中