2017-03-06 10 views
5

जब आप स्पार्क में टाइमस्टैम्प कॉलम बनाते हैं, और लकड़ी की छत पर सहेजते हैं, तो आपको 12 बाइट पूर्णांक कॉलम प्रकार (int96) मिलता है; मैं इकट्ठा करता हूं कि डेटा जूलियन दिवस के लिए 6-बाइट्स और दिन के भीतर नैनोसेकंड के लिए 6 बाइट्स में विभाजित होता है।स्पार्क का int96 समय प्रकार

यह किसी भी लकड़ी की छत logical type के अनुरूप नहीं है। लकड़ी की छत फ़ाइल में स्कीमा, फिर, स्तंभ के संकेत को एक पूर्णांक के अलावा कुछ भी संकेत नहीं देता है।

मेरा सवाल यह है कि स्पार्क एक बड़े पूर्णांक के विपरीत टाइमस्टैम्प के रूप में इस तरह के कॉलम को लोड करने के बारे में कैसे जानता है?

+2

दरअसल यह 8 + 4 बाइट्स है, 6 + 6 नहीं। इस प्रकार को दस्तावेज़ करने के लिए एक पुल अनुरोध है, https://github.com/apache/parquet-format/pull/49 देखें। – Zoltan

+0

काफी सही, क्षमा करें। – mdurant

उत्तर

2

सेमेन्टिक्स मेटाडेटा के आधार पर निर्धारित किया जाता है।

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

उदाहरण डेटा::

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) 

और Hadoop विन्यास:

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

अब हम स्पार्क मेटाडाटा का उपयोग कर सकते: हम कुछ आयात की आवश्यकता होगी

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

और परिणाम है:

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

समतुल्य जानकारी मेटास्टोर में भी संग्रहीत की जा सकती है।

आधिकारिक दस्तावेज इस हाइव और इम्पाला के साथ संगतता प्राप्त करने के लिए प्रयोग किया जाता है के अनुसार:

कुछ लकड़ी उत्पादक प्रणाली, विशेष इम्पाला और हाइव, INT96 में दुकान टाइमस्टैम्प में। यह ध्वज स्पार्क एसक्यूएल को इन सिस्टम के साथ संगतता प्रदान करने के लिए टाइमस्टैम्प के रूप में INT96 डेटा की व्याख्या करने के लिए बताता है।

और spark.sql.parquet.int96AsTimestamp संपत्ति का उपयोग करके नियंत्रित किया जा सकता है।