天天看點

csv輸入的第一行字段數有錯_ClickHouse最佳實戰之Clickhouse的輸入輸出資料格式詳解...

csv輸入的第一行字段數有錯_ClickHouse最佳實戰之Clickhouse的輸入輸出資料格式詳解...
ClickHouse最佳實戰之Clickhouse的輸入輸出資料格式詳解 官網:

Distinctive Features | ClickHouse Documentation​clickhouse.tech

csv輸入的第一行字段數有錯_ClickHouse最佳實戰之Clickhouse的輸入輸出資料格式詳解...

CLickHouse擁有豐富的輸入輸出格式,對不同的輸入輸出格式特性的了解有利于對資料的導入,查詢的展示,CLickHouse主要分為7種類型系列的輸入輸出格式,分别是

1、tabseparated系列格式

2、tskv格式

3、csv系列格式

4、json系列格式

5、parquet格式

6、orc格式

7、其他常用的資料格式

一、TabSeparated、TabSeparatedRaw、TabSeparatedWithNames和TabSeparatedWithNamesAndTypes

1. TabSeparated

資料按行寫入,tab制表符分隔。使用嚴格Unix指令行。

注意:最後一行必須包含換行符。

預設格式。

簡寫:TSV

資料插入和資料查詢時,均可使用。

建立表

CREATE TABLE tsv_demo(srcip String, destip String, time String) ENGINE = TinyLog;

資料導入

clickhouse-client --query "INSERT INTO tsv_demo FORMAT TabSeparated" --max_insert_block_size=100000 < tsv_demo.tsv

Code: 117. DB::Exception:

You have carriage return (r, 0x0D, ASCII 13) at end of first row.

It's like your input data has DOS/Windows style line separators, that are illegal in TabSeparated format. You must transform your file to Unix format.

But if you really need carriage return at end of string value of last column, you need to escape it as r.

這是由于windows使用rn表示回車換行, 在linux中使用n表示換行。 是以,需要将r給去掉。

轉換為UNIX格式:

dos2unix tsv_demo.tsv

輸出格式:

select * from tsv_demo FORMAT TSV;

2. TabSeparatedRaw

簡稱:TSVRaw

TabSeparatedRaw格式不會對行資料進行轉義, 即不會将換行、制表符等轉換為轉義字元。

隻能在資料查詢的時候使用。

zhangsan nanjingtjiangsu 23 From nanjing

lisi hangzhoutzhejiang 32 x41 amazing place

xiaoming hefeitanhui 25 notepad

建表語句:

create table escape_demo(name String, addr String, age UInt8, desc String) ENGINE=TinyLog;

select * from escape_demo FORMAT TSV;

zhangsan nanjingtjiangsu 23 From nanjing

lisi hangzhoutzhejiang 32 A amazing place

xiaoming hefeitanhui 25 notepad

3 rows in set. Elapsed: 0.005 sec.

SELECT *

FROM escape_demo

FORMAT TabSeparatedRaw

zhangsan nanjing jiangsu 23 From nanjing

lisi hangzhou zhejiang 32 A amazing place

xiaoming hefei anhui 25 notepad

3 rows in set. Elapsed: 0.005 sec

3. TabSeparatedWithNames

在查詢時,TabSeparatedWithNames格式的第一行顯示列的名稱

在資料導入時,第一行完全被忽略,不會解析第一行為表頭。

簡稱:TSVWithNames

在資料查詢和資料導入均可使用。

資料導入:

clickhouse-client --query="INSERT INTO escape_demo FORMAT TSVWithNames" < escape_demo.tsv

資料查詢:

select * from escape_demo FORMAT TSVWithNames;

4. TabSeparatedWithNamesAndTypes

在查詢時,TabSeparatedWithNamesAndTypes格式在主資料的前面額外顯示兩行資料,第一行顯示列的名稱, 第二行顯示列的資料類型。

在資料導入時,前面兩行的資料完全被忽略。

簡寫:TSVWithNamesAndTypes

在資料導入和查詢時均可使用。

二、TSKV

TSKV格式不适合有大量小列的輸出.

TSKV的效率并不比JSONEachRow差.

TSKV資料查詢和資料導入。

不需要保證列的順序。

支援忽略某些值,這些列使用預設值,例如0和空白行。複雜類型的值必須指定,無法使用預設值。

檢視:

select * from escape_demo FORMAT TSKV;

導出:

clickhouse-client --query "select * from escape_demo FORMAT TSKV" > tskv.demo

導入:

clickhouse-client --query "insert into escape_demo FORMAT TSKV" < tskv.demo

三、CSV格式:CSV、CSVWithNames

1. CSV格式:CSV、CSVWithNames

CSV預設的分隔符為逗号,format_csv_delimiter設定自定義的分隔符。

CSV中的雙引号使用兩個雙引号轉義。

支援資料的查詢和資料導入的。

create table csv_demo(create_date Date, update_time DateTime, desc String) ENGINE=TinyLog;

2014-03-23|2014-03-23 14:10:14|Apache Spark achieves high performance

2014-03-23|2014-03-23 15:10:30|Spark offers over 80 high-level operators

1395990600|1395904200|Learning Apache "Spark" is easy

資料導入:

clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO csv_demo FORMAT CSV" < csv_dmeo.csv

資料檢視:

set format_csv_delimiter='|'

select * from csv_demo FORMAT CSV;

2. CSVWithNames

CSVWithNames會列印表頭的資訊。

支援資料的導入和資料的檢視。

select * from csv_demo FORMAT CSVWithNames;

四、JSON系列格式:JSON、JSONCompact和JSONEachRow

1. JSON

JSON格式隻支援資料的輸出,不支援資料的解析(資料導入)。

create table t_json_demo(id UInt8, prov String) ENGINE=TinyLog;

insert into t_json_demo values(1, 'jiangsu'),

(1, 'jiangsu'),

(2, 'anhui'),

(2, 'anihu'),

(3, 'beijing');

預設情況下, Int64和UInit64的整型使用雙引号包裹, 如果要移除雙引号, 設定配置參數output_format_json_quote_64bit_integers為0。

rows_before_limit_at_least:隻有查詢包含LIMIT時才輸出, 隻有在包含group by的語句中才有意義。當查詢沒有LIMIT時, 執行結果的最小行數。

2. JSONCompact

JSON格式的資料以對象的方式輸出, 而JSONCompact以數組的方式輸出。

JSONCompact隻支援資料的檢視, 不支援資料的導入。

3. JSONEachRow

每行資料以換行符分隔的JSON對象。

支援資料的輸出和資料導入。

資料導入:

對象中鍵值對的順序可任意排列。

缺失某些字段。

create table UserActivity (PageViews UInt8, UserID String, Duration UInt64, Sign Int8) ENGINE TinyLog;

INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}

缺失值的處理:

CREATE TABLE IF NOT EXISTS example_table

(

x UInt32,

a DEFAULT x + 2

) ENGINE = Memory;

insert into example_table FORMAT JSONEachRow {"x":3, "a":5} {"x":4};

參數:input_format_defaults_for_omitted_fields

如果為0, 則x和a的預設值等于0(即UInt32資料類型的預設值)。

如果為1, 則x的預設值等于0, 但a的預設值等于x+2。

input_format_defaults_for_omitted_fields=1

嵌套結構的資料

CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory;

INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]};

{"n": { "s": ["abc", "def"],"i": [1, 23]}}

要将資料作為分層JSON對象插入, 需要設定input_format_import_nested_json=1。

當需要設定input_format_import_nested_json=0時:

INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}

Exception on client:

Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n

Connecting to 192.168.0.200:9000 as user default.

Connected to ClickHouse server version 20.1.4 revision 54431.

五、Parquet資料格式

支援Parquet格式的導出和導入。

Parquet和ClickHouse類型的比對關系:

Parquet data type (INSERT)| ClickHouse data type| Parquet data type (SELECT)

UINT8,BOOL UInt8 UINT8

INT8 Int8 INT8

UINT16 UInt16 UINT16

INT16 Int16 INT16

UINT32 UInt32 UINT32

INT32 Int32 INT32

UINT64 UInt64 UINT64

INT64 Int64 INT64

FLOAT,HALF_FLOAT Float32 FLOAT

DOUBLE Float64 DOUBLE

DATE32 Date UINT16

DATE64,TIMESTAMP DateTime UINT32

STRING,BINARY String STRING

— FixedString STRING

DECIMAL Decimal DECIMAL

不支援的Parquet資料類型:DATE32, TIME32, FIXED_SIZE_BINARY, JSON, UUID, ENUM。

注意: ClickHouse表的列名必須與Parquet表的列名一緻。

ClickHouse表的列資料類型可以不同于插入的Parquet資料類型。 在插入資料時, ClickHouse根據上表解釋資料類型, 然後将資料類型轉換為ClickHouse表的列資料類型。

資料的導出:

clickhouse-client --query="SELECT * FROM tsv_demo FORMAT Parquet" > parquet_demo.parquet

資料的導入:

create table parquet_demo (srcip String, destip String, time String) ENGINE=TinyLog;

cat parquet_demo.parquet | clickhouse-client --query="INSERT INTO parquet_demo FORMAT Parquet"

六、ORC

僅支援ORC格式的寫入。

ORC和CH資料類型的比對關系:

ORC data type (INSERT)|ClickHouse data type

UINT8, BOOL UInt8

INT8 Int8

UINT16 UInt16

INT16 Int16

UINT32 UInt32

INT32 Int32

UINT64 UInt64

INT64 Int64

FLOAT, HALF_FLOAT Float32

DOUBLE Float64

DATE32 Date

DATE64, TIMESTAMP DateTime

STRING, BINARY String

DECIMAL Decimal

不支援的ORC資料類型:DATE32, TIME32, FIXED_SIZE_BINARY, JSON, UUID, ENUM。

Note: ClickHouse表的列名必須與ORC表的列名一緻。

使用Spark生成ORC檔案:

val list = List(

("113.248.234.232", "123.212.22.01", "2018-07-12 14:35:31"),

("115.248.158.231", "154.245.56.23", "2020-07-12 13:26:26"),

("115.248.158.231", "154.245.56.23", "2020-07-12 13:22:13"),

("187.248.135.230", "221.228.112.45", "2019-08-09 13:17:39"),

("187.248.234.232", "221.228.112.24", "2019-08-09 20:51:16"),

("115.248.158.231", "154.245.56.23", "2020-07-12 17:22:56")

)

val rdd = sc.makeRDD(list)

import spark.implicits._

val df = rdd.toDF("srcip", "destip", "time")

df.repartition(1).write.format("orc").mode("append").save("/tmp/orc")

測試表:

create table orc_demo (srcip String, destip String, time DateTime) ENGINE=TinyLog;

資料導入:

cat file.orc | clickhouse-client --query="INSERT INTO orc_demo FORMAT ORC"

七、其他常用的資料格式:

1. Native

資料以二進制資料塊的方式進行讀寫。

資料的導出:

clickhouse-client --query="SELECT * FROM tsv_demo FORMAT Native" > a.native

資料的導入:

clickhouse-client --query="insert into tsv_demo FORMAT Native" < a.native

2. Null

主要用于測試性能。 查詢會被處理,并且資料會被傳送到用戶端,但是什麼也不輸出。

Null格式隻能用于查詢, 不能用于資料的導入。

3. Pretty

PrettyCompact:在互動式模式下,預設的資料顯示格式。

PrettySpace

4. Values

每行之間使用逗号分隔,列之間也是使用逗号分隔。在括号中列印每一行。

INSERT INTO XX values

INSERT INTO XX FORMAT Values

insert into tsv_demo FORMAT Values ('115.248.158.231', '115.248.158.232', '2020-07-12 17:22:56'), ('115.248.158.231', '115.248.158.232', '2020-07-12 17:22:56');

5. Vertical

資料以垂直的格式進行展示。 G

6. XML

隻支援資料的檢視。

select * from tsv_demo limit 2 FORMAT XML;