获取地理二进制 PySpark 的文本

Get text of geographical binary PySpark

我正在读取使用 AWS DMS 服务从 MySQL table 生成的镶木地板文件。此 table 有一个类型为 Point (WKB) 的字段。当我读取这个 parquet 文件时,Spark 将其识别为二进制类型,代码如下:

file_dataframe = sparkSession.read.format('parquet')\
    .option('encoding', 'UTF-8')\
    .option('mode', 'FAILFAST')\
    .load(file_path)
file_dataframe.schema

这是结果:

StructType(List(StructField(id,LongType,true),...,StructField(coordinate,BinaryType,true),...))

我尝试将列转换为字符串,但这是我得到的:

file_dataframe = file_dataframe.withColumn('coordinates_str', file_dataframe.coordinate.astype("string"))
file_dataframe.select('coordinates_str').show()

+--------------------+
|     coordinates_str|
+--------------------+
|U�...|
|U�...|
|U�...|
|U�...|
|@G
U�...|
|@G
U�...|
|@G
U�...|
| G
U�...|
| G
U�...|
| G
U�...|
| G
U�...|

MySQL 中的这个字段看起来像这样。如果我右键单击 BLOB,我可以在弹出窗口中看到它的值 window。

我感兴趣的是获取我在 MySQL 查看器中看到的 POINT (-84.1370849609375 9.982019424438477) 作为 Spark Dataframe 中的字符串列。这可能吗?我一直在谷歌上搜索它,但没能找到让我走上正轨的东西。

试试这个:

file_dataframe.withColumn('coordinates_str', decode(col('coordinate'), 'US-ASCII'))

在进一步谷歌搜索并阅读关于点数据类型的 MySQL 文档后,我发现 this documentation page 提到点存储为 WKB 或 WKT,这是保存地理位置的标准。

许多引擎都支持这种格式,可以轻松获取文本,以及许多其他地理操作,具有一组特定的功能。

不过,经过一番研究,我没有发现Spark有这些功能built-in。它似乎需要一些进一步的配置才能公开这些功能,所以我最终使用了支持 built-in 的 AWS Athena。 Athena geospatial documentation can be found here.