我目前有一个名为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会更快吗?
答案 0 :(得分:2)
如果您在hive Metastore中注册表,则可以设置spark.sql.autoBroadcastJoinThreshold
来自doc:
配置表的最大大小(以字节为单位) 在执行连接时广播到所有工作节点。通过设置这个 可以禁用-1到广播的值。请注意,目前 只有Hive Metastore表支持统计信息 命令ANALYZE TABLE COMPUTE STATISTICS noscan已经 运行