在Athena中讀取表時出現HIVE_CURSOR_ERROR

當您嚐試讀取Athena中的表時,選擇查詢將返回一條HIVE_CURSOR_ERROR消息。

寫的annapurna.hiriyur

最後發布日期:2022年5月10日

問題

方法中的說明創建了一個外部表,並將其與Delta Lake集成馬上和雅典娜到三角洲湖整合文檔。

Athena中的外部表是在Apache Hive metastore中定義的。

您從Athena查詢編輯器運行一個外部表上的選擇查詢,它返回一個HIVE_CURSOR_ERROR

HIVE_CURSOR_ERROR: cannot read value at 0 in block 0 in file s3://

導致

問題的根本原因是Hive和Apache Spark中使用了不同的Parquet約定。

在Spark 1.4或以上版本中,使用當前的Parquet格式,十進製值被寫入整數。在Parquet格式的早期版本中,十進製值以Apache的定長字節數組格式寫入。其他Apache係統(如Hive和Apache Impala)也使用這種Parquet格式。

因此,當由於使用兩種Parquet格式而導致數據類型的內部表示不同時,您將收到一個錯誤。

解決方案

如果使用Athena或Presto訪問Delta Lake托管表,Parquet文件必須以與Hive兼容的格式創建。

你不能在Hive中選擇Parquet約定,但是你可以在Spark中這樣做。

設置spark.conf.set(“spark.sql.parquet.writeLegacyFormat”,真的)屬性,以解決該問題。

設置集群級別的屬性。

  1. 編輯集群屬性。
  2. 點擊高級選項
  3. 選擇火花
  4. 中輸入屬性設置火花配置字段。
  5. 確認更改。
  6. 重新啟動集群。
刪除

信息

更改表的DDL以匹配Spark數據類型不會返回任何查詢結果。spark.conf.set(“spark.sql.parquet.writeLegacyFormat”,真的)必須設置。

請參閱劇場正廳座位配置文檔獲取更多信息。