创建具有记录类型列的表
Posted
技术标签:
【中文标题】创建具有记录类型列的表【英文标题】:Create a table with Record type column 【发布时间】:2016-01-27 14:28:51 【问题描述】:我想创建一个包含记录类型列和非记录类型列的新表。 该表将由查询填充。
这是查询:
select country, Count(*) CNT_Events,item,currency,sum(amount) as SUM_amount, count(transactionID) as CNT_transactionID
from
(select "US" country, "USD" currency, "book" item, 20 amount, 1 transactionID),
(select "Spain" Country,"EUR" currency, "book" item, 10 amount, 2 transactionID),
(select "US" Country,"USD" currency, "cup" item, 5 amount, 3 transactionID),
(select "Spain" Country,"EUR" currency, "notebook" item, 15 amount, 4 transactionID),
(select "Spain" Country,"EUR" currency, "notebook" item, 13 amount, 5 transactionID),
(select "US" Country, "null" currency, "null" item, null amount, null transactionID)
GROUP BY country, item, currency
架构:
[
'name': 'country', 'type': 'STRING',
'name': 'CNT_Events', 'type': 'INTEGER',
'name': 'Purchases', 'type': 'RECORD',
'mode': 'REPEATED',
'fields': [
'name': 'item', 'type': 'STRING',
'name': 'currency', 'type': 'STRING',
'name': 'SUM_amount', 'type': 'integer',
'name': 'CNT_transactionID', 'type': 'integer'
]
,
]
结果:
Country CNT_Events Purchases.item Purchases.currency Purchases.SUM_amount Purchases.CNT_transactionID
US 3 cup USD 5 1 book USD 20 1
Spain 3 book EUR 10 1 notebook EUR 28 2
我该怎么做? 谢谢!
【问题讨论】:
【参考方案1】:下面应该可以工作
SELECT country, CNT_Events, Purchases.item, Purchases.currency, Purchases.SUM_amount, Purchases.CNT_transactionID
FROM JS(
( // input table
SELECT country, SUM(CNT_Events) AS CNT_Events, NEST(CONCAT(item, ',', currency, ',', STRING(SUM_amount) , ',', STRING(CNT_transactionID))) AS Purchases
FROM (
SELECT country, COUNT(1) CNT_Events, item, currency, SUM(amount) AS SUM_amount, COUNT(transactionID) AS CNT_transactionID
FROM
(SELECT "US" country, "USD" currency, "book" item, 20 amount, 1 transactionID),
(SELECT "Spain" Country,"EUR" currency, "book" item, 10 amount, 2 transactionID),
(SELECT "US" Country,"USD" currency, "cup" item, 5 amount, 3 transactionID),
(SELECT "Spain" Country,"EUR" currency, "notebook" item, 15 amount, 4 transactionID),
(SELECT "Spain" Country,"EUR" currency, "notebook" item, 13 amount, 5 transactionID),
(SELECT "US" Country, "null" currency, "null" item, NULL amount, NULL transactionID)
GROUP BY country, item, currency
) GROUP BY country
),
country, CNT_Events, Purchases, // input columns
"[ // output schema
'name': 'country', 'type': 'STRING',
'name': 'CNT_Events', 'type': 'INTEGER',
'name': 'Purchases', 'type': 'RECORD',
'mode': 'REPEATED',
'fields': [
'name': 'item', 'type': 'STRING',
'name': 'currency', 'type': 'STRING',
'name': 'SUM_amount', 'type': 'integer',
'name': 'CNT_transactionID', 'type': 'integer'
]
]",
"function(row, emit) // function
var c = [];
for (var i = 0; i < row.Purchases.length; i++)
x = row.Purchases[i].split(',');
t = item:x[0],
currency:x[1],
SUM_amount:parseInt(x[2]),
CNT_transactionID:parseInt(x[3]) ;
c.push(t);
;
emit(country: row.country, CNT_Events: row.CNT_Events, Purchases: c);
"
)
我认为输出符合预期:
[
"country": "US",
"CNT_Events": "3",
"Purchases": [
"item": "book",
"currency": "USD",
"SUM_amount": "20",
"CNT_transactionID": "1"
,
"item": "cup",
"currency": "USD",
"SUM_amount": "5",
"CNT_transactionID": "1"
]
,
"country": "Spain",
"CNT_Events": "3",
"Purchases": [
"item": "notebook",
"currency": "EUR",
"SUM_amount": "28",
"CNT_transactionID": "2"
,
"item": "book",
"currency": "EUR",
"SUM_amount": "10",
"CNT_transactionID": "1"
]
]
【讨论】:
以上是关于创建具有记录类型列的表的主要内容,如果未能解决你的问题,请参考以下文章