从CSV文件复制Cassandra表格

8

我正在我的Mac上(使用Oracle jdk1.7.0_55和Mac OS X Yosemite)搭建Cassandra、Apache Spark和Flume的演示环境。这个环境将作为一个新分析平台的概念验证,因此我需要在我的Cassandra数据库中添加一些测试数据。我正在使用Cassandra 2.0.8。

我在Excel中创建了一些演示数据,并将其导出为CSV文件。结构如下:

ProcessUUID;ProcessID;ProcessNumber;ProcessName;ProcessStartTime;ProcessStartTimeUUID;ProcessEndTime;ProcessEndTimeUUID;ProcessStatus;Orderer;VorgangsNummer;VehicleID;FIN;Reference;ReferenceType
0F0D1498-D149-4FCC-87C9-F12783FDF769;AbmeldungKl‰rfall;1;Abmeldung Kl‰rfall;2011-02-03 04:05+0000;;2011-02-17 04:05+0000;;Finished;SIXT;4278;A-XA 1;WAU2345CX67890876;KLA-BR4278;internal

接下来我使用cqlsh创建了一个键空间和一个列族:

CREATE KEYSPACE dadcargate 
WITH REPLICATAION  = { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };

use dadcargate;

CREATE COLUMNFAMILY Process (
  ProcessUUID uuid, ProcessID varchar, ProcessNumber bigint, ProcessName varchar, 
  ProcessStartTime timestamp, ProcessStartTimeUUID timeuuid, ProcessEndTime timestamp, 
  ProcessEndTimeUUID timeuuid, ProcessStatus varchar, Orderer varchar,
  VorgangsNummer varchar, VehicleID varchar, FIN varchar, Reference varchar,
  ReferenceType varchar, 
PRIMARY KEY (ProcessUUID))
WITH COMMENT='A process is like a bracket around multiple process steps';

列族名称及其中的所有列均使用小写字母创建 - 这也是某一天需要调查的问题,但目前并不那么重要。

现在我将使用以下方式将具有约1600个条目的CSV文件导入名为process的表格中:

cqlsh:dadcargate> COPY process (processuuid, processid, processnumber, processname, 
processstarttime, processendtime, processstatus, orderer, vorgangsnummer, vehicleid,
fin, reference, referencetype) 
FROM 'Process_BulkData.csv' WITH DELIMITER = ';' AND HEADER = TRUE;

它会显示以下错误:

Record #0 (line 1) has the wrong number of fields (15 instead of 13).
0 rows imported in 0.050 seconds.

这基本上是正确的,因为我的 cvs-export 中没有 timeUUID 字段。

如果我尝试不带显式列名执行 COPY 命令,就像这样(考虑到实际上缺少两个字段):

cqlsh:dadcargate> COPY process from 'Process_BulkData.csv' 
WITH DELIMITER = ';' AND HEADER = TRUE;

我遇到了另一个错误:

Bad Request: Input length = 1
Aborting import at record #0 (line 1). Previously-inserted values still present.
0 rows imported in 0.009 seconds.

嗯,有点奇怪,但好吧。也许COPY命令不喜欢有两个字段缺失的事实。从结构上看,我仍然觉得这很奇怪,因为缺失的字段当然存在,只是为空。

我还有另一种尝试:我在Excel中删除了缺失的列,将文件再次导出为CSV格式,并尝试在我的CSV文件中使用明确的列名称而无需头行来进行导入,如下所示:

cqlsh:dadcargate> COPY process (processuuid, processid, processnumber, processname, 
processstarttime, processendtime, processstatus, orderer, vorgangsnummer, vehicleid, 
fin, reference, referencetype) 
FROM 'Process_BulkData-2.csv' WITH DELIMITER = ';' AND HEADER = TRUE;

I get this error:

Bad Request: Input length = 1
Aborting import at record #0 (line 1). Previously-inserted values still present.
0 rows imported in 0.034 seconds.

有人能告诉我在这里做错了什么吗?根据复制命令的文档,我设置命令的方式应该至少适用于其中两个。但是,显然我在这里漏掉了一些重要的东西。

在你的最后一次尝试中,你提到你的.csv文件中没有包含标题行,但我清楚地看到你的COPY命令中有AND HEADER = TRUE - Aaron
是的,我更改了文件(现在没有标题),看看会发生什么:错误请求:输入长度=1中止导入记录#0(第1行)。 先前插入的值仍然存在。 - siliconchris
2个回答

16

cqlsh的COPY命令可能有些敏感。然而,在COPY文档中有这样一行:

CSV输入中的列数与Cassandra表元数据中的列数相同。

记住这一点,我成功地使用COPY FROM导入了您的数据,通过为空字段(分别是processstarttimeuuidprocessendtimeuuid)命名:

aploetz@cqlsh:stackoverflow> COPY process (processuuid, processid, processnumber, 
processname, processstarttime, processstarttimeuuid, processendtime, 
processendtimeuuid, processstatus, orderer, vorgangsnummer, vehicleid, fin, reference, 
referencetype) FROM 'Process_BulkData.csv' WITH DELIMITER = ';' AND HEADER = TRUE;

1 rows imported in 0.018 seconds.
aploetz@cqlsh:stackoverflow> SELECT * FROM process ;

 processuuid                          | fin               | orderer | processendtime            | processendtimeuuid | processid         | processname        | processnumber | processstarttime          | processstarttimeuuid | processstatus | reference  | referencetype | vehicleid | vorgangsnummer
--------------------------------------+-------------------+---------+---------------------------+--------------------+-------------------+--------------------+---------------+---------------------------+----------------------+---------------+------------+---------------+-----------+----------------
 0f0d1498-d149-4fcc-87c9-f12783fdf769 | WAU2345CX67890876 |    SIXT | 2011-02-16 22:05:00+-0600 |               null | AbmeldungKl‰rfall | Abmeldung Kl‰rfall |             1 | 2011-02-02 22:05:00+-0600 |                 null |      Finished | KLA-BR4278 |      internal |    A-XA 1 |           4278

(1 rows)

嗨,Bryce,谢谢你的提示。我成功地导入了我的数据。非常感谢。 - siliconchris
如果有帮助的话,需要注意使用单引号。如果您在 csv 文件周围使用双引号,则会出现不正确的复制命令错误。 - morpheus

0

将csv文件加载到Cassandra表中

步骤1)使用以下网址安装Cassandra加载程序
sudo wget https://github.com/brianmhess/cassandra-loader/releases/download/v0.0.23/cassandra-loader

步骤2)sudo chmod +x cassandra-loader

a)csv文件名为"pt_bms_tkt_success_record_details_new_2016_12_082017-01-0312-30-01.csv"

b)键空间名称为"bms_test"

c)表名为"pt_bms_tkt_success_record_details_new"

d)列为"trx_id......trx_day"

步骤3)csv文件位置和cassandra-loader位于"cassandra3.7/bin/"

步骤$)[stp@ril-srv-sp3 bin]$ ./cassandra-loader -f pt_bms_tkt_success_record_details_new_2016_12_082017-01-0312-30-01.csv -host 192.168.1.29 -schema "bms_test.pt_bms_tkt_success_record_details_new(trx_id,max_seq,trx_type,trx_record_type,trx_date,trx_show_date,cinema_str_id,session_id,ttype_code,item_id,item_var_sequence,trx_booking_id,venue_name,screen_by_tnum,price_group_code,area_cat_str_code,area_by_tnum,venue_capacity,amount_currentprice,venue_class,trx_booking_status_committed,booking_status,amount_paymentstatus,event_application,venue_cinema_companyname,venue_cinema_name,venue_cinema_type,venue_cinema_application,region_str_code,venue_city_name,sub_region_str_code,sub_region_str_name,event_code,event_type,event_name,event_language,event_genre,event_censor_rating,event_release_date,event_producer_code,event_item_name,event_itemvariable_name,event_quantity,amount_amount,amount_bookingfee,amount_deliveryfee,amount_additionalcharges,amount_final,amount_tax,offer_isapplied,offer_type,offer_name,offer_amount,payment_lastmode,payment_lastamount,payment_reference1,payment_reference2,payment_bank,customer_loginid,customer_loginstring,offer_referral,customer_mailid,customer_mobile,trans_str_sales_status_at_venue,trans_mny_trans_value_at_venue,payment_ismypayment,click_recordsource,campaign,source,keyword,medium,venue_multiplex,venue_state,mobile_type,transaction_range,life_cyclestate_from,transactions_after_offer,is_premium_transaction,city_type,holiday_season,week_type,event_popularity,transactionrange_after_discount,showminusbooking,input_source_name,channel,time_stamp,life_cyclestate_to,record_status,week_name,number_of_active_customers,event_genre1,event_genre2,event_genre3,event_genre4,event_language1,event_language2,event_language3,event_language4,event_release_date_range,showminusbooking_range,reserve1,reserve2,reserve3,reserve4,reserve5,payment_mode,payment_type,date_of_first_transaction,transaction_time_in_hours,showtime_in_hours,trx_day)";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接