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
.
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
Khá đúng, xin lỗi. – mdurant