java - স্পার্ক স্ট্র্যাচড স্ট্রিমিং স্বয়ংক্রিয়ভাবে টাইমস্ট্যাম্পকে স্থানীয় সময়ে রূপান্তর করে




scala apache-spark (2)

আমার জন্য এটি ব্যবহার করতে কাজ করেছে:

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

এটি স্পার্ক এসকিউএলকে টাইমস্ট্যাম্পগুলির জন্য ইউটিসিটিকে ডিফল্ট টাইমজোন হিসাবে ব্যবহার করতে বলে। আমি উদাহরণস্বরূপ এটি স্পার্ক এসকিউএল এ ব্যবহার করেছি:

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

আমি জানি এটি 2.0.0 তে কাজ করে না। তবে স্পার্ক ২.২ এ কাজ করে। আমি SQLTransformer ব্যবহার করেছিলাম এবং এটি কাজ করে।

যদিও আমি স্ট্রিমিং সম্পর্কে নিশ্চিত নই।

আমার ইউটিসি এবং 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 এ কার্যকর। আরও নতুন স্পার্ক সংস্করণের জন্য উত্তর দেখুন

তবে আমাদের লক্ষ করা উচিত যে আজকের হিসাবে (স্পার্ক spark.sql.session.timeZone ) spark.sql.session.timeZone user.timezone ( java.util.TimeZone.getDefault ) সেট করে না। সুতরাং `ark spark.sql.session.timeZone` নির্ধারণের ফলে একা বরং বিশ্রী পরিস্থিতি তৈরি করতে পারে যেখানে এসকিউএল এবং নন- এসকিউএল উপাদানগুলি বিভিন্ন টাইমজোন সেটিংস ব্যবহার করে।

অতএব আমি এখনও user.timezone সেট করা user.timezone স্পষ্টভাবে user.timezone spark.sql.session.timeZone সেট করার পরামর্শ spark.sql.session.timeZone

টিএল; ডিআর, দুর্ভাগ্যক্রমে এইভাবে স্পার্ক এখনই টাইমস্ট্যাম্পগুলি পরিচালনা করে এবং তারিখ / সময় উপযোগিতা ব্যবহার না করে সরাসরি যুগের সময় সরাসরি পরিচালনা করা ছাড়া অভ্যন্তরীণ বিকল্প নেই alternative

আপনি স্পার্ক বিকাশকারীদের তালিকার অন্তর্দৃষ্টিপূর্ণ আলোচনা করতে পারেন: এসকিউএল টাইমস্ট্যাম্প শব্দার্থবিজ্ঞান বনাম স্পার্ক -18350

আমি এখন পর্যন্ত যে পরিচ্ছন্নতম কাজের সন্ধান পেয়েছি তা -Duser.timezone ড্রাইভার এবং এক্সিকিউটার উভয়ের জন্য UTC -Duser.timezone সেট করা। জমা দেওয়ার সাথে উদাহরণস্বরূপ:

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