2016-09-20 35 views
2

我有时间序列数据的一个非常大的表有这些列:应用自定义函数的火花数据帧组

  • 时间戳
  • LicensePlate
  • UberRide#
  • 速度

每一批LicensePlate/UberRide数据都应该考虑整套数据进行处理。换句话说,我不需要需要逐行处理数据,但所有的行按照(LicensePlate/UberRide)分组在一起。

我打算在数据框api中使用spark,但是我对如何执行spark组合数据框的自定义计算感到困惑。

我需要做的是:

  1. 获取所有数据
  2. 集团通过一些列
  3. 的foreach火花数据帧组施加一个F(X)。返回自定义对象的foreach组
  4. 通过应用G(X)并返回一个自定义对象

我可以做怎样步骤3和4得到的结果?我应该使用哪些API(dataframe,dataset,rdd,可能是熊猫...)的任何提示?

的整个工作流程可以看到下面:

Workflow

+1

熊猫不是Spark的一部分,你可以使用'DataFrame',但是你必须[必须在Scala中执行](http://stackoverflow.com/a/32101530/1560062)和[add Python包装](http://stackoverflow.com/a/33257733/1560062),RDD应该工作得很好。 – zero323

+0

我不能直接使用Spark吗?我使用Spark 1.6.2 – guilhermecgs

+0

如果你的意思是PySpark,那么就像我说的 - RDDs应该工作得很好。 – zero323

回答

5
  • 虽然星火提供了一些方法来与大熊猫整合它不会使分布式大熊猫。因此,无论你在Spark中使用熊猫是如何使用本地的(在转换中使用驱动程序或执行程序)操作。

    如果你正在寻找一个类似Pandas的API的分布式系统,你应该看看dask

  • You can define User Defined Aggregate functions or Aggregators处理分组Datasets,但是这部分API只能在Scala中直接访问。当你创建一个write a Python wrapper并不难。
  • RDD API提供了大量的可用于在组执行操作开始低水平repartition/repartitionAndSortWithinPartitions和与多个*byKey方法(combineByKeygroupByKeyreduceByKey等)结束的功能。

    哪一个适用于您的案例取决于您要应用的函数的属性(它是关联和交换的,它可以在流上工作,它是否需要特定的顺序)。

    最一般的,但低效率的方法可概括如下:

    h(rdd.keyBy(f).groupByKey().mapValues(g).collect()) 
    

    在从值f映射到keyg对应于每个组的聚集和h是最终合并。大多数时候你可以做得比这更好,所以它应该只用作最后的手段。

  • 相对复杂的逻辑可以使用DataFrames/Spark SQL和window functions表示。