Eu tenho um PySpark UDF que quando tento aplicar a cada linha para uma das colunas df e obtenho uma nova coluna, obtenho um [Ljava.lang.Object;@7e44638d (valor diferente após o @ para cada linha)
Veja o udf abaixo:
def getLocCoordinates(property_address):
url = "https://maps.googleapis.com/maps/api/geocode/json"
querystring = {f"address":property_address},"key":"THE_API_KEY"}
response = requests.get(url, params=querystring)
response_json = json.loads(response.text)
for adr in response_json['results']:
geometry = adr['geometry']
coor = geometry['location']
lat = coor['lat']
lng = coor['lng']
coors = lat, lng
return coors
getCoorsUDF = udf(lambda x:getLocCoordinates(x))
df = df.withColumn("AddressCoordinates", getCoorsUDF(col("FullAddress") ) )
Tentei:
getCoorsUDF = udf(getLocCoordinates, FloatType()) --> retorna NULL para cada linha da coluna "AddressCoordinates" recém-criada.
getCoorsUDF = udf(getLocCoordinates, StringType()) --> retorna [Ljava.lang.Object;@
getCoorsUDF = udf(getLocCoordinates) --> retorna [Ljava.lang.Object;@
O resultado é assim:
Número de referência | Endereço completo | Coordenadas de Endereço |
---|---|---|
1234 | Alguns endereços | [Ljava.lang.Object;@ |
Isso é retornado para cada linha no dataframe.
Inicialmente, eu estava usando a função em um notebook Python e estava funcionando bem, com lat e lng retornando para cada endereço. No entanto, tive que migrar para o PySpark e estou batendo em um obstáculo aqui.
Acho que você está vendo a
[Ljava.lang.Object;@...
saída porque sua UDF está retornando uma tupla Python ((lat, lng)
), e o PySpark não sabe como serializar isso em uma coluna DataFrame, a menos que você defina explicitamente um esquema de retorno que o Spark entenda.Você deve retornar um
StructType
com campos paralat
elng
. Por exemplo, você pode fazer algo assim: