Google bigquery 干运行模式将必填字段标记为可空

Google bigquery 干运行模式将必填字段标记为可空,google-bigquery,Google Bigquery,我正在使用JavaAPI从使用干运行的查询中获取模式,但是我得到的模式包含可为空的字段,而这些字段实际上是必需的 例如,使用此查询: SELECT word FROM `bigquery-public-data.samples.shakespeare` 即使表中需要“word”字段,但返回的结果是 com.google.api.services.bigquery.model.TableSchema = {"fields":[{"mode":"NULLABLE","name":"word","

我正在使用JavaAPI从使用干运行的查询中获取模式,但是我得到的模式包含可为空的字段,而这些字段实际上是必需的

例如,使用此查询:

SELECT word FROM `bigquery-public-data.samples.shakespeare`
即使表中需要“word”字段,但返回的结果是

com.google.api.services.bigquery.model.TableSchema = 
{"fields":[{"mode":"NULLABLE","name":"word","type":"STRING"}]}

这是应该发生的吗?

是的,这是可能发生的-查询结果可能与表架构中的“可空”和“必需”不同,即使查询只是简单地选择字段。通常,列可空性的传播是脆弱的,所以最好不要依赖它


另外,看起来您使用的是标准SQL(尽管遗留SQL也可能发生类似的情况)

我认为从查询干运行中获取模式只适用于标准SQL—以前我们是通过创建一个视图来获取模式的,该视图正确地保留了必填字段。您能否详细说明查询结果如何为必填字段设置空值?还有其他方法可以获得与视图相同的模式吗(因为标准SQL还不支持视图)?让我换一种方式问一下-为什么您关心它是否被标记为REQUIRED或NULLABLE?您的应用程序发生了哪些变化?我的团队正在围绕大查询客户端构建一个类型安全的Scala api,我们的部分方法是将可空字段映射到Scala选项类型。这反过来意味着此类型安全API的用户将看到他们期望需要的字段的选项类型。应用程序当然可以自由地解包该选项,但这会造成混乱,并在某种程度上违背类型安全的目的。对于遗留SQL,我们通过从查询中创建一个视图来获得模式,该视图保留了必填字段。但现在使用空运行,必填字段返回为空,所以所有内容都是一个选项。有什么想法吗?我们是否应该尝试找到另一种方法?使用标准SQL,输出模式中永远不会需要它,它总是将非重复字段标记为可空。如果您要创建视图(一旦它被支持),它也可以为空。但正如你上面所说的,这并没有错,只是可能不够精确。