Vertica COPY with Pre-Join TABLES

时间:2016-04-26 10:47:36

标签: vertica

我有两个表Hits和Devices(例如)。

CREATE TABLE Hits (
  url VARCHAR(255) NOT NULL,
  DeviceId INTEGER NOT NULL
);

CREATE TABLE Devices (
  DeviceId INTEGER NOT NULL PRIMARY KEY,
  OS VARCHAR(30) NOT NULL,
  Device VARCHAR(30),
);

ALTER TABLE Hits ADD CONSTRAINT fk_devices FOREIGN KEY(DeviceId) REFERENCES Devices(DeviceId);

另外,我在csv中有一个原始数据:

some url|Android|Device name
another url|Android|Device name
url|iOS|iPhone
url|Android|

原始数据实时填写,我需要把它放到vertica。 使用COPY加载单个表中的所有数据没有问题,但我想优化查询和存储。我怎么加载它?

1 个答案:

答案 0 :(得分:1)

Denormalize最适合这种情况。首先,列域非常小。其次,数据已经进入非规范化。省去很多麻烦,并创建一个表。

CREATE TABLE Device_Hits (
  url VARCHAR(255) NOT NULL,
  OS VARCHAR(30) NOT NULL,
  Device VARCHAR(30),
);

写一个简单的COPY语句并加载代表性的数据量。对于Database Designer(DBD)阶段,您必须越多越好。

-- You may need LOCAL if you are streaming from a client
-- This works from the node itself as dbadmin
COPY Device_Hits (url, OS, Device)
FROM '/path/to/somefile.csv' DELIMITER '|' DIRECT;

然后运行admintools并执行DBD。如果您有任何代表性查询,请先将它们放在一个文件中,这样您就可以告诉DBD在哪里查看。 DBD将对数据进行排序和编码。

但实际上,这可能是我打赌的大量RLE编码。

绝对不要使用prejoin投影过度复杂化。那些有一定的局限性,老实说,在这种情况下,你真的不会给你太多。 Vertica在这些类型的非规范化方面表现出色。