簡體   English   中英

使用 DSBulk 加載數據時元組的正確 CSV 格式是什么?

[英]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插入行

  1. 假設我將 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]

  2. 如果我將頻率設置為{\"1234\":{\"[1, 2]\":1}}
    java.lang.IllegalArgumentException:期望記錄包含 4 個字段但找到了 5 個。

  3. 如果我將頻率設置為{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' 干杯!


請將鼠標懸停在標簽上,然后單擊“ Watch tag ”按鈕,支持 Apache Cassandra 社區。 謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM