【发布时间】:2018-10-21 23:02:57
【问题描述】:
如何使用 Scala 语言从 hdfs 数据集中读取数据? data 是任何记录有限的“CSV”文件。
【问题讨论】:
标签: scala apache-spark apache-spark-sql
如何使用 Scala 语言从 hdfs 数据集中读取数据? data 是任何记录有限的“CSV”文件。
【问题讨论】:
标签: scala apache-spark apache-spark-sql
您使用 Spark 标记了问题,所以我假设您正在尝试使用它。我建议您首先阅读此处的 Spark 文档,以了解如何使用 Spark 与您的数据进行交互。
https://spark.apache.org/docs/latest/quick-start.html
https://spark.apache.org/docs/latest/sql-programming-guide.html
但是,为了回答您的具体问题,在 Spark 中,您可以使用如下代码读取 CSV 文件:
val csvDf = spark.read.format("csv")
.option("sep", ",")
.option("header", "true")
.load("hdfs://some/path/to/data.csv/")
您提供的路径将指向 HDFS 上的 CSV 文件,或包含多个 CSV 文件的文件夹。此外,Spark 将接受其他类型的文件系统。例如,您还可以使用“file://”来访问本地文件系统,或者使用“s3://”来使用 S3。加载数据后,您将拥有一个 Spark DataFrame 对象,其中包含可与之交互的类似 SQL 的方法。
注意,我提供了一个分隔符选项,只是为了向您展示如何操作,但它默认为“,”,所以它不是必需的。此外,如果您的 CSV 文件不包含标头,则您需要自己指定 Schema 并将标头设置为 false。
【讨论】:
您可以按照以下方法从 HDFS 读取数据:-
val hdfs = FileSystem.get(new URI("hdfs://hdfsUrl:port/"), new Configuration())
val path = new Path("/pathOfTheFileInHDFS/")
val stream = hdfs.open(path)
def readLines = Stream.cons(stream.readLine, Stream.continually( stream.readLine))
//此示例检查行是否为空并打印每个现有行 readLines.takeWhile(_ != null).foreach(line => println(line))
也请看这篇文章https://blog.matthewrathbone.com/2013/12/28/reading-data-from-hdfs-even-if-it-is-compressed
如果这回答了您的问题,请告诉我。
【讨论】: