在bigquery的bq命令行工具

时间:2015-11-20 19:54:23

标签: escaping google-bigquery

我正在尝试使用bq命令行自动生成新的每日表

bq query \
  --destination_table=<destination> \
  --allow_large_results \
  --noflatten_results \
  '<query>'

以下给出。问题是sql查询中有一堆单引号和双引号,而bq命令行工具也使用单引号来划分要执行的查询。

所以我知道问题是我必须逃避引号,但我无法弄清楚如何做到这一点。我试过用“\”来替换查询中的单引号(没有双引号),但这没有帮助,这似乎是合乎逻辑的事情。我假设有一些显而易见的事情,我没有做,所以希望有人可以在没有大量工作的情况下帮助我。

SELECT
  time,
  userId,
  deviceId,
  systemName,
  LEFT(systemVersion,3) AS systemVersionMajor,
  systemVersion AS systemVersionMinor,
  deviceModel,
  appVersion,
  country,
  city,
  firstRun,
  priorTimeSpentInApp,
  priorSessions,
  priorEvents,
  event_name,
  event_info,
  event_time,
  event_value,
  MAX(CASE WHEN user_attribute.Name = 'Gen_Total_Sessions' THEN FLOAT(user_attribute.Value) END) AS Gen_Total_Sessions.attr,
  MAX(CASE WHEN user_attribute.Name = 'Gen_Last_Achievement' THEN STRING(user_attribute.Value) END) AS Gen_Last_Achievement.attr,
  MAX(CASE WHEN event_parameters.Name = 'Gamemode' THEN STRING(event_parameters.Value) END) AS Gamemode.param,
  MAX(CASE WHEN event_parameters.Name = 'Player_Level' THEN FLOAT(event_parameters.Value) END) AS Player_Level.param,

FROM
  TABLE_QUERY([projectId:dataSet], "table_id CONTAINS 'table1' OR table_id CONTAINS 'table2' OR table_id CONTAINS 'table3'"),
WHERE
  event_name = 'Started'
GROUP BY
  time,
  userId,
  deviceId,
  systemName,
  systemVersionMajor,
  systemVersionMinor,
  deviceModel,
  appVersion,
  country,
  city,
  firstRun,
  priorTimeSpentInApp,
  priorSessions,
  priorEvents,
  event_name,
  event_info,
  event_time,
  event_value 

***添加了更多信息 我已经读过有关使用转义码的内容,我对它有一些了解,但我无法让它工作。这是我尝试在命令行上运行的一个非常简单的示例:

bq query 'SELECT time, userId, event_name, event_time, FROM 
TABLE_QUERY([rhi-localytics-db:LEANPLUM_DATA], \"table_id CONTAINS \'table1\'
OR table_id CONTAINS \'table2\' OR table_id CONTAINS \'table3\' \" ), WHERE 
event_name = \'Error\' GROUP BY time, userId, event_time, event_value' 

对我来说这看起来不错,但是当我运行它时bash说“-bash:语法错误附近意外令牌”)“

但我不明白为什么。我已经将外层单引号传递给bq未转义,我已经逃过了内部的每一个引用。似乎bash不传输引号而不处理转义码本身..?

2 个答案:

答案 0 :(得分:1)

你应该使用escape char \,如下面的

select 'ab\"c\'123'

读取&#34;转义字符串中的特殊字符&#34; https://cloud.google.com/bigquery/query-reference#stringfunctions

下的部分

答案 1 :(得分:1)

我认为你的问题是bash不允许你在单引号内转义引号。双引号允许您进行奇特的转义和替换,但单引号可以为您提供您输入的内容,直到下一个单引号字符。

请点击此处了解详情:How to escape single-quotes within single-quoted strings?

您有两个选项来处理此问题:

  • 使用上面链接中的一种引用策略
  • 在查询字符串
  • 中根据需要切换到双引号并转义
  • 将原始查询文本放入文件中,并使用bq query "$(< myquery.txt)"
  • 在文件中进行啜食
  • 使用https://bigquery.cloud.google.com/处的网络用户界面,该网址支持选项面板中所需的所有选项