加入大小数据集的最有效方法

时间:2016-11-15 22:08:37

标签: scala apache-spark

我目前有一个名为chartEvents的大型RDD,其中包含以下格式的数据:

case class ChartEvent(patientID: String, itemID: String, chartTime: String, storeTime: String, value: String,
    valueNum: String, warning: String, error: String)

数据来自35 GB .csv文件,我使用SQL解析该文件:

CSVUtils.loadCSVAsTable(sqlContext, "data_unzipped/CHARTEVENTS.csv")
val chartEvents = sqlContext.sql(
  """
    |SELECT SUBJECT_ID, ITEMID, CHARTTIME, STORETIME, VALUE, VALUENUM, WARNING, ERROR
    |FROM CHARTEVENTS
  """.stripMargin)
  .map(r => ChartEvent(r(0).toString, r(1).toString, r(2).toString, r(3).toString, r(4).toString,
    r(5).toString, r(6).toString, r(7).toString))

我有一个单独的,非常小的(少于100行)RDD,名为featureMapping RDD[(itemID, label)],其中这两个都是字符串。我要做的是将chartEvents RDD过滤到仅包含featureMapping中的itemID的行。我目前的方法是执行两个RDD的内部连接,如下所示:

val result = chartEvents.map{case event => (event.itemID, event)}.join(featureMapping)

但是,我注意到这可能需要几个小时才能运行,并且在我的/user/<user>/appdata/local/temp文件夹中占用了大量空间。有没有更有效的方法来执行此过滤?将它编码到sqlContext会更快吗?

1 个答案:

答案 0 :(得分:2)

如果您在hive Metastore中注册表,则可以设置spark.sql.autoBroadcastJoinThreshold

来自doc

  

配置表的最大大小(以字节为单位)   在执行连接时广播到所有工作节点。通过设置这个   可以禁用-1到广播的值。请注意,目前   只有Hive Metastore表支持统计信息   命令ANALYZE TABLE COMPUTE STATISTICS noscan已经   运行