2017-03-06 20 views
5

Khi bạn tạo một cột dấu thời gian trong tia lửa và lưu vào sàn gỗ, bạn sẽ nhận được một loại cột nguyên 12 byte (int96); Tôi thu thập dữ liệu được chia thành 6 byte cho ngày Julian và 6 byte cho nano giây trong ngày.Loại thời gian int96 của Spark

Điều này không phù hợp với bất kỳ sàn gỗ nào logical type. Giản đồ trong tệp sàn gỗ không, sau đó, đưa ra một dấu hiệu của cột là bất cứ thứ gì trừ một số nguyên.

Câu hỏi của tôi là, Spark biết cách tải một cột như một dấu thời gian như trái ngược với một số nguyên lớn?

+2

Thực ra nó là 8 + 4 byte, chứ không phải 6 + 6. Có yêu cầu kéo để ghi lại loại này, xem https://github.com/apache/parquet-format/pull/49. – Zoltan

+0

Khá đúng, xin lỗi. – mdurant

Trả lời

2

Ngữ nghĩa được xác định dựa trên siêu dữ liệu. Chúng tôi sẽ cần một số hàng nhập khẩu:

import org.apache.parquet.hadoop.ParquetFileReader 
import org.apache.hadoop.fs.{FileSystem, Path} 
import org.apache.hadoop.conf.Configuration 

dữ liệu Ví dụ:

val path = "/tmp/ts" 

Seq((1, "2017-03-06 10:00:00")).toDF("id", "ts") 
    .withColumn("ts", $"ts".cast("timestamp")) 
    .write.mode("overwrite").parquet(path) 

và cấu hình Hadoop:

val conf = spark.sparkContext.hadoopConfiguration 
val fs = FileSystem.get(conf) 

Bây giờ chúng ta có thể truy cập Spark metadata:

ParquetFileReader 
    .readAllFootersInParallel(conf, fs.getFileStatus(new Path(path))) 
    .get(0) 
    .getParquetMetadata 
    .getFileMetaData 
    .getKeyValueMetaData 
    .get("org.apache.spark.sql.parquet.row.metadata") 

và kết quả là:

String = {"type":"struct","fields: [ 
    {"name":"id","type":"integer","nullable":false,"metadata":{}}, 
    {"name":"ts","type":"timestamp","nullable":true,"metadata":{}}]} 

Thông tin tương đương cũng có thể được lưu trữ trong Metastore.

Theo tài liệu chính thức này được sử dụng để đạt được khả năng tương thích với Hive và Impala:

Một số hệ thống Parquet sản xuất, đặc biệt là Impala và Hive, cửa hàng Timestamp vào INT96. Cờ này yêu cầu Spark SQL giải thích dữ liệu INT96 như một dấu thời gian để cung cấp khả năng tương thích với các hệ thống này.

và có thể được kiểm soát bằng cách sử dụng thuộc tính spark.sql.parquet.int96AsTimestamp.

Các vấn đề liên quan