有人知道BigQuery模式定义的文档在哪里吗?换句话说,就是您在上传文件时提供的JSON模式- personsDataSchema.json
在此示例中。
我已经搜寻Google很久了,但是找不到关于架构的任何文档。
我能得到的最接近的是有关自动检测模式的文档。但是在不合适的情况下,并且您需要提供预定义的JSON模式,是否有任何文档说明哪些字段是必需的,哪些值是允许的?
1> Willian Fuks..:
要定义一个模式,所有你需要的主要是定义3个字段:name
,type
和mode
。
表中的每个字段都必须定义了这三个键。例如,如果您有一个像这样的表:
user_id source
1 search
2 email
然后可以将该模式定义为:
[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"},
{"name": "source", "type": "STRING", "mode": "NULLABLE"}]
该键name
仅描述字段名称,例如“ user_id”。
关键type
是数据类型,例如STRING,INTEGER,FLOAT等。当前,BigQuery支持以下类型:
串
INT64
浮标64
布尔
BYTES(字节表示字节)。
日期
约会时间
时间
时间戳
记录
现在,如果您打开文档,您将看到我们也具有ARRAY
REPEATED字段的数据类型。稍后再讨论。
第三个键mode
可以是以下之一:
NULLABLE(允许值为NULL
)
必填(不允许为NULL
)
REPEATED(这是ARRAY字段,这意味着该字段基本上是值列表)。
因此,让我们以前面的示例为例,并添加一个重复的字段(即ARRAY字段)来说明:
user_id source wishlist
1 search ["sku 0", "sku 1"]
2 email []
3 direct ["sku 0", "sku 3"]
该模式可以定义如下:
[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"},
{"name": "source", "type": "STRING", "mode": "NULLABLE"},
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"}]
在那里,ARRAY字段定义为字符串值的重复。
我们仍然只剩下一种类型的字段,那就是RECORD字段(STRUCT)。这些基本相同,除了我们还fields
为它们定义了第四个键。由于RECORD包含其他字段,因此您还必须描述它们的定义。用一个例子更容易理解:
user_id source wishlist location.country location.city
1 search ["sku 0", "sku 1"] USA NY
2 email [] USA LA
3 direct ["sku 0", "sku 3"] BR SP
这location
是一个RECORD(STRUCT),里面有2个键:country
和和city
。这就是为它们定义方案的方式:
[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"},
{"name": "source", "type": "STRING", "mode": "NULLABLE"},
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"},
{"name": "location", "type": "RECORD", "mode": "NULLABLE", "fields": [{"name": "country", "type": "STRING", "mode": "NULLABLE"}, {"name": "city", "type": "STRING", "mode": "NULLABLE"}]}]
您想拥有RECORDS的REPEATED字段吗?当然,为什么不呢!例如,如果您希望每个hit
客户在您的网站中拥有一个REPEATED字段,则可以这样定义架构:
[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"},
{"name": "source", "type": "STRING", "mode": "NULLABLE"},
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"},
{"name": "location", "type": "RECORD", "mode": "NULLABLE", "fields": [{"name": "country", "type": "STRING", "mode": "NULLABLE"}, {"name": "city", "type": "STRING", "mode": "NULLABLE"}]},
{"name": "hit", "type": "RECORD", "mode": "REPEATED", "fields": [{"name": "hitNumber", "type": "INT64", "mode": "NULLABLE"}, {"name": "hitPage", "type": "STRING", "mode": "NULLABLE"}]}]
有了所有这些,我们最终可以回答您的问题,如何dataPersons.json
定义架构?
这是一行personData的示例:
{"kind": "person",
"fullName": "John Doe",
"age": 22,
"gender": "Male",
"phoneNumber": {"areaCode": "206", "number": "1234567"},
"children": [{"name": "Jane", "gender": "Female", "age": "6"},
{"name": "John", "gender": "Male", "age": "15"}],
"citiesLived": [{"place": "Seattle", "yearsLived": ["1995"]},
{"place": "Stockholm", "yearsLived": ["2005"]}]}
首先,我们有"kind": "person"
。这很简单,其架构为:
{"name": "kind", "type": "STRING", "mode": "REQUIRED" or "NULLABLE"}
phoneNumber
是带有两个内部字段的RECORD(STRUCT)字段,areaCode
和number
。好了,我们已经了解了如何定义它们!
{"name": "phoneNumber",
"type": "RECORD",
"mode": "NULLABLE OR REQUIRED",
"fields": [{"name": "areaCode", "type": "INT64", "mode": "NULLABLE"},
{"name": "number", "type": "INT64", "mode": "NULLABLE"}]}
现在children
,citiesLived
它们具有相同的定义,即它们都是RECORD(STRUCT)的REPEATED(ARRAY)字段。就像在上一个示例中一样,这个示例也应该很简单。citiesLived
将被定义为:
{"name": "citiesLived",
"type": "RECORD",
"mode": "REPEATED",
"fields": [{"name": "place", "type": "STRING", "mode": "NULLABLE"},
{"name": "yearLived", "type": "INT64", "mode": "REPEATED"}]}
那里有它。基本上,这就是模式定义。例如,如果您使用Python,则想法是相同的。导入类SchemaField
以定义每个字段,如下所示:
from google.cloud.bigquery import SchemaField
field_kind = SchemaField(name="kind", type="STRING", mode="NULLABLE")
其他客户将遵循相同的想法。
所以总结一下,你总要确定您的表中的每个字段3个键name
,type
和mode
。如果该字段是RECORD类型,则还必须定义,fields
并且对于每个内部字段,您都需要再次定义3个键(如果内部字段又是RECORD类型,则定义4个)。
希望这使如何定义模式更加清晰。让我知道您是否仍然对此主题有任何疑问,我将更新答案。