[英]What is the correct CSV format for tuples when loading data with DSBulk?
我最近開始為我的新項目使用 Cassandra 並進行一些負載測試。
我有這樣一個場景,我正在使用 CSV 進行 dsbulk 加載,
$ dsbulk load -url <csv path> -k <keyspace> -t <table> -h <host> -u <user> -p <password> -header true -cl LOCAL_QUORUM
我的 CSV 文件條目如下所示,
userid birth_year created_at freq
1234 1990 2023-01-13T23:27:15.563Z {1234:{"(1, 2)": 1}}
列類型,
userid bigint PRIMARY KEY,
birth_year int,
created_at timestamp,
freq map<bigint, frozen<map<frozen<tuple<tinyint, smallint>>, smallint>>>
問題是,對於列freq
,我嘗試了不同的方法來設置 csv 中的值,如下所示,但無法使用dsbulk
插入行
假設我將 freq 設置為{1234:{[1, 2]: 1}}
, com.datastax.oss.dsbulk.workflow.commons.schema.InvalidMappingException: Could not map field freq to variable freq; 從 Java 類型 java.lang.String 轉換為 CQL 類型 Map(BIGINT => Map(Tuple(TINYINT, SMALLINT) => SMALLINT, not frozen), not frozen) 原始值失敗:{1234:{[1,2] :1}} 引起:java.lang.IllegalArgumentException:無法將'{1234:{[1, 2]:1}}'解析為Json 引起:com.fasterxml.jackson.core.JsonParse'Exception:意外字符['(代碼 91)):期望有效的名稱字符(對於不帶引號的名稱)或雙引號(對於帶引號的名稱)在 [Source: (String)“{1234:{[1, 2]: 1 }}“; 行:1,列:9]
如果我將頻率設置為{\"1234\":{\"[1, 2]\":1}}
,
java.lang.IllegalArgumentException:期望記錄包含 4 個字段但找到了 5 個。
如果我將頻率設置為{1234:{"[1, 2]": 1}} or {1234:{"(1, 2)": 1}}
,
來源:1234,80,2023-01-13T23:27:15.563Z,“{1234:{“”[1, 2]“”: 1}}” java.lang.IllegalArgumentException: 預期記錄包含 4 個字段但已找到5.
但是在COPY FROM TABLE
命令中, freq {1234:{[1, 2]:1}}
的值插入到 DB 中沒有任何錯誤,DB 中的值看起來像這樣{1234: {(1, 2): 1}}
我猜當我嘗試使用 dsbulk 時 JSON 不接受數組(元組)作為鍵? 有人可以告訴我這是什么問題以及如何解決這個問題嗎? 感謝你的幫助。
使用DataStax Bulk Loader (DSBulk)加載數據時,CQL tuple
類型的 CSV 格式與COPY... FROM
命令使用的格式不同,因為 DSBulk 使用不同的解析器。
格式化 CSV 數據在您的案例中特別具有挑戰性,因為該列包含多個嵌套的 CQL collections。
InvalidMappingException
DSBulk 使用的 JSON 解析器在包含元組時不接受括號()
。 它還希望元組用雙引號括起來"
否則你會得到如下錯誤:
com.datastax.oss.dsbulk.workflow.commons.schema.InvalidMappingException: \
Could not map field ... to variable ...; \
conversion from Java type ... to CQL type ... failed for raw value: ...
...
Caused by: java.lang.IllegalArgumentException: Could not parse '...' as Json
...
Caused by: com.fasterxml.jackson.core.JsonParseException: \
Unexpected character ('(' (code 91)): was expecting either valid name character \
(for unquoted name) or double-quote (for quoted) to start field name
...
IllegalArgumentException
由於元組的值包含逗號 ( ,
) 作為分隔符,因此 DSBulk 錯誤地解析了行,它認為每行包含的字段比預期的多,並拋出IllegalArgumentException
,例如:
java.lang.IllegalArgumentException: Expecting record to contain 2 fields but found 3.
為了方便起見,這里是我用作示例的表的架構:
CREATE TABLE inttuples (
id int PRIMARY KEY,
inttuple map<frozen<tuple<tinyint, smallint>>, smallint>
)
在此示例 CSV 文件中,我使用 pipe 字符 ( |
) 作為分隔符:
id|inttuple
1|{"[2,3]":4}
這是另一個使用制表符作為分隔符的示例:
id\t inttuple
1\t {"[2,3]":4}
請注意,您需要使用-delim '|'
指定分隔符或運行 DSBulk 時使用-delim '\t'
。 干杯!
請將鼠標懸停在cassandra標簽上,然后單擊“ Watch tag
”按鈕,支持 Apache Cassandra 社區。 謝謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.