如何在PySpark中按地理位置过滤条目?

时间:2016-08-18 16:48:42

标签: python hadoop apache-spark pyspark hdinsight

我有一个时间段内用户的Lat / Lon格式的位置数据集,我想使用GIS函数过滤条目。例如,查找多边形内的条目(来自GIS世界的ST_Contains)并使用ESRI geodatabase文件添加一个列,该列是用户条目所在的区域。

我在网上搜索过Magellan,但目前Python支持not working。我还在Esri Spatial中找到了Hive对GIS功能的支持,但没有找到有关如何在启动PySpark时加载正确的包或如何在PySpark shell中注册所需函数的文档:(ST_Polygon,ST_Contains,等...)。

我还应该研究其他替代方案吗?我正在使用Azure的HDInsight,因此我可以访问PySpark shell中的HiveContext对象:

>>> sqlContext
<pyspark.sql.context.HiveContext object at 0x7f3294093b10>

示例数据集:

  

|时间戳|用户|纬度|经度|   | 1462838468 | 49B4361512443A4DA ... | 39.777982 | -7.054599 |   | 1462838512 | 49B4361512443A4DA ... | 39.777982 | -7.054599 |   | 1462838389 | 49B4361512443A4DA ... | 39.777982 | -7.054599 |   | 1462838497 | 49B4361512443A4DA ... | 39.777982 | -7.054599 |   | 1465975885 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1457723815 | 405C238E25FE0B9E7 ... | 37.177322 | -7.426781 |   | 1457897289 | 405C238E25FE0B9E7 ... | 37.177922 | -7.447443 |   | 1457899229 | 405C238E25FE0B9E7 ... | 37.177922 | -7.447443 |   | 1457972626 | 405C238E25FE0B9E7 ... | 37.18059 | -7.46128 |   | 1458062553 | 405C238E25FE0B9E7 ... | 37.177322 | -7.426781 |   | 1458241825 | 405C238E25FE0B9E7 ... | 37.178172 | -7.444512 |   | 1458244457 | 405C238E25FE0B9E7 ... | 37.178172 | -7.444512 |   | 1458412513 | 405C238E25FE0B9E7 ... | 37.177322 | -7.426781 |   | 1458412292 | 405C238E25FE0B9E7 ... | 37.177322 | -7.426781 |   | 1465197963 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1465202192 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1465923817 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1465923766 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1465923748 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |   | 1465923922 | 6E9E0581E2A032FD8 ... | 37.118362 | -8.205041 |

1 个答案:

答案 0 :(得分:1)

你可以在Spark中使用任何python库,不需要库特定于Spark。一些随机搜索推荐的一些GIS python库位于http://spatialdemography.org/essential-python-geospatial-libraries/

您必须安装要使用的库。有关如何安装库的说明,请访问:https://stackoverflow.com/a/38754345/1663781

然后,只需使用任何库向RDD添加一列,如下所示:

from my_gis_library_of_choice import in_polygon, district

text_lines = sc.textFile('wasb:///mydataset')
split = text_lines.map(lambda line: line.split('|'))
with_extra_columns = split.map(lambda r: r.append(in_polygon(r[2], r[3])).append(district(r[2], r[3])))