Structured Streaming-创建流式的dataset和dataframe

流式dataframe可以通过DataStreamReader接口来创建,DataStreamReader对象是通过SparkSession的readStream()方法返回的。与创建静态dataframe的read()方法类似,我们可以指定数据源的一些配置信息,比如data format、schema、option等。

一 输入源

spark 2.0中初步提供了一些内置的source支持。

  • file source:以数据流的方式读取一个目录中的文件。支持text、csv、json、parquet等文件类型。文件必须是被移动到目录中的,比如用mv命令。
  • kafka source:从kafka中读取数据。
  • socket source:从socket连接中读取文本内容。driver是负责监听请求的server socket。socket source只能被用来进行测试。

某些sources不是容错的,因为它们不能保证在故障后可以使用检查点偏移量重播数据。 

Structured Streaming-创建流式的dataset和dataframe_第1张图片

举个简单的例子:

SparkSession spark = ...

// Read text from socket
Dataset socketDF = spark
  .readStream()
  .format("socket")
  .option("host", "localhost")
  .option("port", 9999)
  .load();

socketDF.isStreaming();    // Returns True for DataFrames that have streaming sources

socketDF.printSchema();

// Read all the csv files written atomically in a directory
StructType userSchema = new StructType().add("name", "string").add("age", "integer");
Dataset csvDF = spark
  .readStream()
  .option("sep", ";")
  .schema(userSchema)      // Specify schema of the csv files
  .csv("/path/to/directory");    // Equivalent to format("csv").load("/path/to/directory")

这些示例生成无类型的Streaming DataFrames,这意味着在编译时不会检查DataFrame的schema,仅在运行时当查询提交时进行检查。 某些操作,如map,flatMap等,需要在编译时知道该类型。 要做到这一点,我们可以使用与静态DataFrame相同的方法将这些无类型的Streaming DataFrames转换为类型化的Streaming Datasets。

二 Schema接口和流式DataFrams/Datasets的分区

默认情况下,基于文件的source的Structured Streaming需要我们指定schema,而不是依靠Spark自动推断。 这种限制确保了一致的schema将被用于Streaming式查询,即使在出现故障的情况下也是如此。 对于特殊用例,我们可以通过将spark.sql.streaming.schemaInference设置为true来重新启用schema推断。 

当存在名为/ key = value /的子目录时会发生分区发现,并且列表将自动递归到这些目录中。 如果这些列显示在用户提供的模式中,则它们将根据正在读取的文件的路径由Spark填充。 构成分区方案的目录必须在查询开始时显示,并且必须保持静态。 例如,当/ data / year = 2015 /存在时可以添加/ data / year = 2016 /,但更改分区列无效(即创建目录/ data / date =17 /)。

你可能感兴趣的:(Streaming)