Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用C编写BigQuery中的非平面模式#_C#_.net Core_Google Bigquery - Fatal编程技术网

C# 用C编写BigQuery中的非平面模式#

C# 用C编写BigQuery中的非平面模式#,c#,.net-core,google-bigquery,C#,.net Core,Google Bigquery,我一直在使用Google.Cloud.BigQuery.V2nuget包,似乎找不到任何具体的例子来创建一个非平凡(我指的是非平面)的表创建/行插入模式 我们以这个对象为例: public class DataEntry { public string Id { get; set; } public string Name { get; set; } public DateTime Created { get; set; } public Dictionar

我一直在使用
Google.Cloud.BigQuery.V2
nuget包,似乎找不到任何具体的例子来创建一个非平凡(我指的是非平面)的表创建/行插入模式

我们以这个对象为例:

public class DataEntry
{
    public string Id { get; set; }

    public string Name { get; set; }

    public DateTime Created { get; set; }

    public Dictionary<string, string> Items { get; set; }
}
公共类数据项
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
已创建公共日期时间{get;set;}
公共字典项{get;set;}
}
字典可能为空或包含多个条目

通过阅读文档,我希望
.Items
映射为
结构的
数组
,但我似乎不知道如何在代码中实际映射此类对象

有人能给我举个例子吗


谢谢

阅读多一点之后,就可以清楚地看到,当向
TableSchemaBuilder
添加类型为
BigQueryDbType.DateTime
的字段时,虽然可以在模式中指定
数组
,但它不能与
结构
组合以映射字典。事后来看,原因很明显,
STRUCT
本质上类似于
系统。对象的属性(字典键)需要提前知道

简而言之,这对我的场景永远不起作用,因为字典键/值对是动态的,并且事先不知道

在深入研究了支持的查询时间函数之后,我遇到了
JSON\u EXTRACT
函数,它提供了一种解决方法。通过将字典扁平化为json并使用basetype
BigQueryDbType.String
存储它,我有了一种保存动态数据并在另一端查询它的方法

有了这些信息,用于为上述对象构建模式的代码将如下所示:

// Build our object
var builder = new TableSchemaBuilder();
builder.Add("Id", BigQueryDbType.String, BigQueryFieldMode.Required);
builder.Add("Name", BigQueryDbType.String, BigQueryFieldMode.Required);
builder.Add("Inserted", BigQueryDbType.DateTime, BigQueryFieldMode.Required);
// ...
// ... Rest of fields
// ...
builder.Add("Items", BigQueryDbType.String, BigQueryFieldMode.Nullable);

// Build our schema
var schema = builder.Build();
SELECT JSON_EXTRACT(Items, "$.KeyOne") AS KeyOne FROM `mytable` LIMIT 1000
假设
Items
值为
{“KeyOne”:“ItemOne”,“KeyTwo”:“ItemTwo”}
,用于梳理字典中第一个值的查询如下所示:

// Build our object
var builder = new TableSchemaBuilder();
builder.Add("Id", BigQueryDbType.String, BigQueryFieldMode.Required);
builder.Add("Name", BigQueryDbType.String, BigQueryFieldMode.Required);
builder.Add("Inserted", BigQueryDbType.DateTime, BigQueryFieldMode.Required);
// ...
// ... Rest of fields
// ...
builder.Add("Items", BigQueryDbType.String, BigQueryFieldMode.Nullable);

// Build our schema
var schema = builder.Build();
SELECT JSON_EXTRACT(Items, "$.KeyOne") AS KeyOne FROM `mytable` LIMIT 1000
希望这能为其他人节省一些时间:)