第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Parquet int96 時間戳通過 python 轉(zhuǎn)換為 datetime/date

Parquet int96 時間戳通過 python 轉(zhuǎn)換為 datetime/date

慕碼人2483693 2022-08-31 16:15:36
TL;DR我想將int96值(例如ACIE4NxJAAAKhSUA)轉(zhuǎn)換為可讀的時間戳格式,例如2020-03-02 14:34:22或任何可以正常解釋的格式...我主要使用python,所以我正在尋找一個執(zhí)行此轉(zhuǎn)換的函數(shù)。如果有另一個功能可以反其道而行之 -- 甚至更好。背景我正在使用鑲木地板工具通過以下通信將原始鑲木地板文件(具有快速壓縮)轉(zhuǎn)換為原始JSON:C:\Research> java -jar parquet-tools-1.8.2.jar cat --json original-file.snappy.parquet > parquet-output.json在JSON中,我看到這些值作為時間戳:{... "_id":"101836","timestamp":"ACIE4NxJAAAKhSUA"}我已經(jīng)確定“ACIE4NxJAAAKhSUA”的時間戳值確實是int96(這也通過讀取鑲木地板文件的架構(gòu)來確認....message spark_schema { ...(stuff)...  optional binary _id (UTF8);  optional int96 timestamp;}我認為這也被稱為Impala Timestamp(至少這是我收集到的)進一步的問題研究我一直在到處尋找一些關(guān)于如何“讀取”int96值的函數(shù)或信息(進入python - 我想用這種語言保留它,因為我最熟悉它)并輸出時間戳 - 我什么也沒找到。以下是我已經(jīng)研究過的一篇文章(與這個主題有關(guān)):ParquetWriter在SO的研究在這里通過golan在SO這里鑄造int96注意:這有一個功能,我可以探索,但我不確定如何深入研究關(guān)于折舊的 int96 時間戳請不要要求我停止在鑲木地板文件中使用舊的/折舊的時間戳格式,我很清楚到目前為止我所做的研究。我是文件/數(shù)據(jù)的接收者 - 我無法更改創(chuàng)建時使用的格式。如果有另一種方法可以控制初始JSON輸出以提供“non int96”值 - 我也會對此感興趣。非常感謝您對SO社區(qū)的幫助!
查看完整描述

2 回答

?
子衿沉夜

TA貢獻1828條經(jīng)驗 獲得超3個贊

拼花工具將無法將格式類型從 INT96 更改為 INT64。您在 json 輸出中觀察到的是存儲在 INT96 時間戳類型中的時間戳的字符串表示形式。您需要火花在INT64 TimestampType中使用時間戳重寫此鑲木地板,然后json輸出將生成時間戳(以您想要的格式)。


您需要在 Spark 中設(shè)置特定的配置 -


spark-shell --conf spark.sql.parquet.outputTimestampType=TIMESTAMP_MICROS


2020-03-16 11:37:50 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Setting default log level to "WARN".

To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).

Spark context Web UI available at http://192.168.0.20:4040

Spark context available as 'sc' (master = local[*], app id = local-1584383875924).

Spark session available as 'spark'.

Welcome to

      ____              __

     / __/__  ___ _____/ /__

    _\ \/ _ \/ _ `/ __/  '_/

   /___/ .__/\_,_/_/ /_/\_\   version 2.4.0

      /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91)

Type in expressions to have them evaluated.

Type :help for more information.


val sourceDf = spark.read.parquet("original-file.snappy.parquet")

2020-03-16 11:38:31 WARN  Utils:66 - Truncated the string representation of a plan since it was too large. This behavior can be adjusted by setting 'spark.debug.maxToStringFields' in SparkEnv.conf.

sourceDf: org.apache.spark.sql.DataFrame = [application: struct<name: string, upgrades: struct<value: double> ... 3 more fields>, timestamp: timestamp ... 16 more fields]


scala> sourceDf.repartition(1).write.parquet("Downloads/output")

拼花工具將顯示正確的時間戳類型


parquet-tools schema Downloads/output/part-00000-edba239b-e696-4b4e-8fd3-c7cca9eea6bf-c000.snappy.parquet 


message spark_schema {

  ...

  optional binary _id (UTF8);

  optional int64 timestamp (TIMESTAMP_MICROS);

  ...

}

而 json 轉(zhuǎn)儲給出了 -


parquet-tools cat --json Downloads/output/part-00000-edba239b-e696-4b4e-8fd3-c7cca9eea6bf-c000.snappy.parquet


{..."_id":"101836", "timestamp":1583973827000000}

記錄的時間戳以納秒為單位。希望這有幫助!


查看完整回答
反對 回復(fù) 2022-08-31
?
慕妹3242003

TA貢獻1824條經(jīng)驗 獲得超6個贊

Doug,這個來自 arrow/cpp/src/parquet/types.h 的代碼顯示了 Int96 時間戳是如何在內(nèi)部存儲的:


constexpr int64_t kJulianToUnixEpochDays = INT64_C(2440588);

constexpr int64_t kSecondsPerDay = INT64_C(60 * 60 * 24);

constexpr int64_t kMillisecondsPerDay = kSecondsPerDay * INT64_C(1000);

constexpr int64_t kMicrosecondsPerDay = kMillisecondsPerDay * INT64_C(1000);

constexpr int64_t kNanosecondsPerDay = kMicrosecondsPerDay * INT64_C(1000);


MANUALLY_ALIGNED_STRUCT(1) Int96 { uint32_t value[3]; };

STRUCT_END(Int96, 12);


static inline void Int96SetNanoSeconds(parquet::Int96& i96, int64_t nanoseconds) {

  std::memcpy(&i96.value, &nanoseconds, sizeof(nanoseconds));

}


static inline int64_t Int96GetNanoSeconds(const parquet::Int96& i96) {

  // We do the computations in the unsigned domain to avoid unsigned behaviour

  // on overflow.

  uint64_t days_since_epoch =

      i96.value[2] - static_cast<uint64_t>(kJulianToUnixEpochDays);

  uint64_t nanoseconds = 0;


  memcpy(&nanoseconds, &i96.value, sizeof(uint64_t));

  return static_cast<int64_t>(days_since_epoch * kNanosecondsPerDay + nanoseconds);

}


查看完整回答
反對 回復(fù) 2022-08-31
  • 2 回答
  • 0 關(guān)注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號