【问题标题】:Spark: Read an inputStream instead of FileSpark:读取输入流而不是文件
【发布时间】:2016-11-24 06:16:47
【问题描述】:

我在 Java 应用程序中使用 SparkSQL 对 CSV 文件进行一些处理,使用 Databricks 进行解析。

我正在处理的数据来自不同的来源(远程 URL、本地文件、谷歌云存储),我习惯于将所有内容都转换为 InputStream,这样我就可以在不知道数据来自何处的情况下解析和处理数据来自。

我在 Spark 上看到的所有文档都是从路径读取文件,例如

SparkConf conf = new SparkConf().setAppName("spark-sandbox").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);
SQLContext sqlc = new SQLContext(sc);

DataFrame df = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .load("path/to/file.csv");

DataFrame dfGrouped = df.groupBy("varA","varB")
    .avg("varC","varD");

dfGrouped.show();

我想做的是从 InputStream 中读取,甚至只是从内存中的字符串中读取。类似于以下内容:

InputStream stream = new URL(
    "http://www.sample-videos.com/csv/Sample-Spreadsheet-100-rows.csv"
    ).openStream();

DataFrame dfRemote = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .load(stream);

String someString = "imagine,some,csv,data,here";

DataFrame dfFromString = sqlc.read()
    .format("com.databricks.spark.csv")
    .option("inferSchema", "true")
    .option("header", "true")
    .read(someString);

我在这里缺少什么简单的东西吗?

我已经阅读了一些关于 Spark Streaming 和自定义接收器的文档,但据我所知,这是为了打开一个将持续提供数据的连接。 Spark Streaming 似乎将数据分成块并对其进行一些处理,期望更多数据以无休止的流形式出现。

我在这里最好的猜测是,作为 Hadoop 的后代,Spark 期望大量数据可能驻留在某个文件系统中。但由于 Spark 无论如何都会在内存中进行处理,所以 SparkSQL 能够解析内存中的数据对我来说是有意义的。

任何帮助将不胜感激。

【问题讨论】:

    标签: java apache-spark apache-spark-sql spark-dataframe databricks


    【解决方案1】:

    您可以使用至少四种不同的方法让您的生活更轻松:

    1. 使用您的输入流,写入本地文件(使用 SSD 快速),使用 Spark 读取。

    2. 为 S3 使用 Hadoop 文件系统连接器 Google Cloud Storage 并将所有内容都转换为文件操作。 (这不会解决从任意 URL 读取的问题,因为没有用于此的 HDFS 连接器。)

    3. 将不同的输入类型表示为不同的 URI,并创建一个实用函数来检查 URI 并触发适当的读取操作。

    4. 与 (3) 相同,但使用案例类而不是 URI,并且仅根据输入类型进行重载。

    【讨论】:

    • 我这里其实是第5个选项,就是把return序列化成JavaRDD,然后把RDD转成DataFrame。感谢您的帮助。
    • 您介意帮助我了解您如何将字符串转换为 RDD 和 Dataframe 吗?就我而言,inputsteam 是一个带有标题的 csv 文件(可以将其转换为字符串)。我需要提供架构吗?或者我可以说 .option("header", "true") 所以它会自动检测架构?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    相关资源
    最近更新 更多