scala 阅读parquet文件,使用spark

zxlwwiss  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(124)

我想读取Parquet文件,因为是使用Spark和过程中每个文件的内容一个接一个。我试图用以下方法来实现它

spark.read
      .option("wholetext", "true")
      .option("compression", "none")
      .textFile("/test/part-00001-d3a107e9-ead6-45f0-bccf-fadcecae45bb-c000.zstd.parquet")

也尝试了许多不同的类似方法,但Spark似乎以某种方式修改了文件内容,因为在阅读它时可能添加了一些选项。
我的最终目标是使用Scala中的okhttp客户端在Clickhouse中加载这些文件。我试图加载的文件没有损坏,Clickhouse在Spark中未使用时成功处理了它。然而,当我尝试使用spark和以下方法时,Clickhouse响应std::exception. Code: 1001, type: parquet::ParquetException, e.what() = Couldn't deserialize thrift: TProtocolException: Invalid data当我尝试打印出从文件中读取的内容时,我看到了以下内容

Europe/Moscoworg.apache.spark.version3.4.1)org.apache.spark.sql.parquet.row.metadata�{"type":"struct","fields":[{"name":"field1","type":"integer","nullable":true,"metadata":{}},{"name":"field2","type":{"type":"array","elementType":"integer","containsNull":true},"nullable":true,"metadata":{}},{"name":"field3","type":{"type":"struct","fields":[{"name":"x","type":"integer","nullable":true,"metadata":{}},{"name":"y","type":"integer","nullable":true,"metadata":{}}]},"nullable":true,"metadata":{}}]}org.apache.spark.legacyDateTimeJparquet-mr version 1.12.3 (build f8dced182c4c1fbdec6ccb3185537b5a01e6ed6b)L^PAR1

看起来里面没有任何数据,似乎只有元数据。
我的问题是如何使用Spark以字符串格式读取parquet文件。

nlejzf6q

nlejzf6q1#

如果您尝试使用spark.sparkContext.binaryFiles(BinaryFiles代码)会怎样?

val files: RDD[(String, PortableDataStream)] = spark.sparkContext.binaryFiles("/path/to/parquet/files/")
files.foreach { case (path, stream) =>
  // Use the `stream` PortableDataStream to get InputStream and read the binary content
  // Process or write the binary content to Clickhouse
}

另一种方法是使用Javas nio API:

import java.nio.file.{Files, Paths}

val bytes = Files.readAllBytes(Paths.get("/path/to/parquet/file"))

相关问题