Bing地图-如何使用dataframe在pyspark中使用路由api

Bing地图-如何使用dataframe在pyspark中使用路由api,pyspark,bing-maps,pyspark-sql,Pyspark,Bing Maps,Pyspark Sql,我试图使用Bing Route API通过传递来自数据帧列的纬度、经度坐标来计算旅行时间。我的代码如下所示: def bing_maps(x_lat, x_long, y_lat, y_long): try: par = { 'wp.0': ''.join([x_lat, ',', x_long]), 'wp.1': ''.join([y_lat, ',', y_long]), 'avoid': 'm

我试图使用Bing Route API通过传递来自数据帧列的纬度、经度坐标来计算旅行时间。我的代码如下所示:

def bing_maps(x_lat, x_long, y_lat, y_long):
    try:
        par = {
            'wp.0': ''.join([x_lat, ',', x_long]),
            'wp.1': ''.join([y_lat, ',', y_long]),
            'avoid': 'minimizeTolls',
            'key' : CMEConfig.bingKey } 
        return requests.get(CMEConfig.bingURL, par).json()['resourceSets'][0]['resources'][0]['travelDuration']

    except:
        return 'no_location_available'

udfbing = udf(bing_maps, IntegerType())  

PostalCodeMatrixDistance3 = PostalCodeMatrixDistance2\
    .withColumn('driving_time', udfbing('FromLatitude', 'FromLongitude', 'ToLatitude', 'ToLongitude'))
驾驶时间在函数中计算,但似乎不想将其交给“驾驶时间”列。我怀疑这与数据类型有关,但我无法理解

手动调用该函数时,它似乎可以工作,请参见示例:

def bing_maps(x_lat, x_long, y_lat, y_long):
    try:
        par = {
            'wp.0': ''.join([x_lat, ',', x_long]),
            'wp.1': ''.join([y_lat, ',', y_long]),
            'avoid': 'minimizeTolls',
            'key' : CMEConfig.bingKey } 
        res = requests.get(CMEConfig.bingURL, par).json()['resourceSets'][0]['resources'][0]['travelDuration']
        print(res)
        return res
    except:
        return 'no_location_available'

bing_maps('42.843', '-2.6748', '42.6667', '-2.4591')
我得到的答案是

2742
当我调用bing_maps而不使用udf时

PostalCodeMatrixDistance3 = PostalCodeMatrixDistance2\
    .withColumn('driving_time', bing_maps('FromLatitude', 'FromLongitude', 'ToLatitude', 'ToLongitude'))
我犯了这个错误:

col should be Column
Traceback (most recent call last):
  File "/usr/hdp/current/spark2-client/python/pyspark/sql/dataframe.py", line 1501, in withColumn
    assert isinstance(col, Column), "col should be Column"
AssertionError: col should be Column

非常感谢您的帮助

我复制了您的代码,它似乎工作正常,这让我相信错误在于您的数据帧的数据类型

您的
bing_maps
函数将调用
'.join([x_lat',',',',x_long]),
,它默认地假定iterable(本例中的列表)的参数都是字符串。这就是为什么手动调用它(不使用用户定义函数udf)有效的原因

如果数据帧中的
“FromLatitude”、“FromLatitude”、“ToLatitude”、“ToLongitude”
列不是
StringType
,而是
DoubleType
,则调用
udfbing
将导致Python TypeError
TypeError:sequence item 0:expected str instance,float found

解决这个问题的一种方法(同时允许将浮点转换为字符串)是更改数据连接的方式。考虑例如改变< /P>
'wp.0': ''.join([x_lat, ',', x_long]),


谢谢你,奥利弗,你的回答帮助我走上正轨。 这不是输入参数导致的问题,但我已经加强了代码的建议,但驾驶时间作为输出。 我将其定义为整数,但不知何故,数据帧希望它返回为字符串

所以我只改变了这句话,它起了作用:

udfbing = udf(bing_maps, StringType())

不确定您的python代码,但想指出Bing地图有一个距离矩阵服务,如果您只需要旅行时间/距离,您应该使用它。它会更快,响应量也会更小:您是否会碰巧共享用于此呼叫的URL?
udfbing = udf(bing_maps, StringType())