SnappyData v.0-5
目标:我想创建一个持久的,复制的ROAD表,并使用Snappy Shell从CSV文件加载它。 ROAD表应该有' road_id'作为防止重复ID的主键。
SET SCHEMA A;
DROP TABLE IF EXISTS ROAD;
DROP TABLE IF EXISTS STAGING_ROAD;
CREATE TABLE STAGING_ROAD
(road_id string, name string)
USING com.databricks.spark.csv
OPTIONS(path 'roads.csv', header 'true');
CREATE TABLE ROAD
(
road_id VARCHAR(64) NOT NULL,
name VARCHAR(64) NOT NULL,
CONSTRAINT road_PK PRIMARY KEY (road_id)
) USING row OPTIONS (BUCKETS '5', REPLICATE, PERSISTENT)
AS (select road_id, name from STAGING_ROAD);
这不起作用。并且,我必须愚蠢地将我的ROAD创建到这个以使它甚至被创建。这没有PK。它没有复制或持久性。
CREATE TABLE ROAD USING row OPTIONS ()
AS (select road_id, name from STAGING_ROAD);
我应该如何编写SnappyData SQL文件的脚本来实现上述目标?
答案 0 :(得分:2)
您可以使用以下脚本实现相同目的:
CREATE TABLE STAGING_ROAD USING com.databricks.spark.csv OPTIONS(path 'roads.csv', header 'true',inferSchema 'true');
CREATE TABLE STAGING_ROAD2 USING row AS (SELECT road_id,name FROM STAGING_ROAD);
CREATE TABLE ROAD
(
road_id VARCHAR(64) NOT NULL PRIMARY KEY,
name VARCHAR(64) NOT NULL
) USING row OPTIONS (PARTITION_BY 'road_id', BUCKETS '5', PERSISTENT 'ASYNCHRONOUS');
INSERT INTO ROAD SELECT road_id, name from STAGING_ROAD2;
DROP TABLE STAGING_ROAD2;
STAGING_ROAD2的创建是由于最新版本不需要的错误。
以编程方式,您可以更简单的方式实现它,如下面的
String roadCsvFile = "road.csv";
snc.sql("CREATE TABLE ROAD( road_id VARCHAR(64) NOT NULL PRIMARY KEY, name VARCHAR(64) NOT NULL) USING row OPTIONS (PARTITION_BY 'road_id', BUCKETS '5', PERSISTENT 'ASYNCHRONOUS')");
DataFrame roadDf = snc.read()
.format("com.databricks.spark.csv") // CSV to DF package
.option("header", "true") // Use first line of all files as header
.option("inferSchema", "true") // Automatically infer data types
.load(roadCsvFile);
// Populate the table in snappy store
roadDf.write().insertInto("ROAD");
答案 1 :(得分:2)
这里有几点意见。由于您想要设置一些约束,因此需要先创建表。然后,您可以将数据插入表中。
a)CREATE TABLE ROAD(road_id VARCHAR(64)NOT NULL,name VARCHAR(64)NOT NULL,CONSTRAINT road_PK PRIMARY KEY(road_id))USING row OPTIONS(PERSISTENT''); 您不必指定REPLICATE关键字(不需要,默认为复制)或BUCKET参数(仅适用于分区表)。
b)理想情况下它应该是INSERT INTO ROAD(SELECT * FROM STAGING_ROAD)。遗憾的是,我们没有SQL支持来自外部数据的批量插入,例如csv,1.5版本中的镶木地板,我假设您正在使用它。这已经在最新版本中得到了解决,并将在后续版本中提供。
c)解决方法是编写Spark作业并插入到创建的行表中。您可以参考文档的http://snappydatainc.github.io/snappydata/jobs/部分。
如果您需要其他信息,请告诉我。