Spark SQL:有效使用窗口功能

时间:2019-02-13 16:11:11

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

基于不同的标准,我必须将当前行的时间戳与上一行进行比较,并检查差异。这是一个拥有十亿行以上的大数据框。这是问题说明: enter image description here

对于errorIdcontainerId的每种组合

  • 如果只有一个logId,则是新的错误日志条目
  • 如果引用ID超过一​​个,则如果前一行与当前行之间的时间戳差异超过1分钟,则为新的错误日志条目。

这是实现:

//Scala Sequence of the columns
List<Column> columns = Arrays.asList(rawData.col("errorId"), rawData.col("containerid"),
            rawData.col("logId"));
    Seq<Column> columnSeq = JavaConverters.asScalaIteratorConverter(columns.iterator()).asScala().toSeq();
//repartitioning raw data
Dataset<Row> sortedData = rawData
                         .repartition(columnSeq)
                         .sort("timestamp");
//Windowspec
WindowSpec w = Window.partitionBy(columnSeq).orderBy("timestamp");

//lag function
sortedData.withColumn("new_log_entry", functions.lag("timestamp", 60).over(w), "false");

//Write sorted data to db

将数据重新分区两次是个好主意吗?首先创建sortedData,然后创建WindowSpec

此实现看起来不错吗?如何检查null logId等?

0 个答案:

没有答案