2016-09-20 34 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表示。