java - स्पार्क स्ट्रैटर्ड स्ट्रीमिंग स्वचालित रूप से टाइमस्टैम्प को स्थानीय समय में बदल देती है




scala apache-spark (2)

मेरे लिए इसने काम किया:

spark.conf.set("spark.sql.session.timeZone", "UTC")

यह स्पार्क एसक्यूएल को टाइमस्टैम्प के लिए यूटीसी को डिफ़ॉल्ट टाइमज़ोन के रूप में उपयोग करने के लिए कहता है। मैंने इसे स्पार्क SQL में उदाहरण के लिए उपयोग किया है:

select *, cast('2017-01-01 10:10:10' as timestamp) from someTable

मुझे पता है कि यह 2.0.1 में काम नहीं करता है। लेकिन स्पार्क 2.2 में काम करता है। मैं SQLTransformer भी इस्तेमाल किया और यह काम किया।

मैं हालांकि स्ट्रीमिंग के बारे में निश्चित नहीं हूं।

मेरे पास UTC और ISO8601 में अपना टाइमस्टैम्प है, लेकिन संरचित स्ट्रीमिंग का उपयोग करते हुए, यह स्वचालित रूप से स्थानीय समय में परिवर्तित हो जाता है। क्या इस रूपांतरण को रोकने का कोई तरीका है? मैं इसे यूटीसी में रखना चाहूंगा।

मैं काफ्का से from_json डेटा पढ़ रहा हूं और फिर from_json स्पार्क फ़ंक्शन का उपयोग करके उन्हें पार्स कर रहा from_json

इनपुट:

{"Timestamp":"2015-01-01T00:00:06.222Z"}

बहे:

SparkSession
  .builder()
  .master("local[*]")
  .appName("my-app")
  .getOrCreate()
  .readStream()
  .format("kafka")
  ... //some magic
  .writeStream()
  .format("console")
  .start()
  .awaitTermination();

स्कीमा:

StructType schema = DataTypes.createStructType(new StructField[] {
        DataTypes.createStructField("Timestamp", DataTypes.TimestampType, true),});

आउटपुट:

+--------------------+
|           Timestamp|
+--------------------+
|2015-01-01 01:00:...|
|2015-01-01 01:00:...|
+--------------------+

जैसा कि आप देख सकते हैं, घंटा अपने आप बढ़ गया है।

पुनश्च: मैंने from_utc_timestamp स्पार्क फ़ंक्शन के साथ प्रयोग करने की कोशिश की, लेकिन कोई भाग्य नहीं।


नोट :

यह उत्तर मुख्य रूप से स्पार्क <2.2 में उपयोगी है। नए स्पार्क संस्करण के लिए द्वारा उत्तर देखें

हालाँकि हमें ध्यान देना चाहिए कि आज के अनुसार (स्पार्क 2.4.0), स्पार्क. user.timezone ( java.util.TimeZone.getDefault ) सेट नहीं करता है। इसलिए `` spark.sql.session.timeZone` की स्थापना अकेले अजीब स्थिति में हो सकती है जहां SQL और गैर-SQL घटक अलग-अलग समयक्षेत्र सेटिंग्स का उपयोग करते हैं।

इसलिए मैं अभी भी स्पष्ट रूप से user.timezone सेट करने की सलाह देता हूं, भले ही spark.sql.session.timeZone . spark.sql.session.timeZone सेट हो।

टीएल; डीआर दुर्भाग्य से यह है कि स्पार्क अभी टाइमस्टैम्प को संभालता है और वास्तव में कोई अंतर्निहित विकल्प नहीं है, सीधे तारीख / समय उपयोगिताओं के उपयोग के बिना, सीधे युग के समय पर काम करने के अलावा।

आप स्पार्क डेवलपर्स सूची पर एक मनोरंजक चर्चा कर सकते हैं: एसक्यूएल टाइमस्टैम्प शब्दार्थ बनाम स्पार्क -18350

अब तक मैंने जो सबसे साफ- -Duser.timezone सेट किया है, वह है ड्राईवर और निष्पादक दोनों के लिए UTC को UTC । प्रस्तुत उदाहरण के लिए:

bin/spark-shell --conf "spark.driver.extraJavaOptions=-Duser.timezone=UTC" \
                --conf "spark.executor.extraJavaOptions=-Duser.timezone=UTC"

या कॉन्फ़िगरेशन फ़ाइलों को समायोजित करके ( spark-defaults.conf ):

spark.driver.extraJavaOptions      -Duser.timezone=UTC
spark.executor.extraJavaOptions    -Duser.timezone=UTC




spark-structured-streaming