В любом случае можно ли указать схему как указание на то, что одна из схем координат должна совпадать?
UserDefinedTypes
(больше не поддерживается), несмотря на все значения в Column
должны иметь одинаковую форму, поэтому вы не можете иметь одновременно array<array<array<double>>>
, array<array<double>>
и array<double>
.
Вы можете полностью пропустить синтаксический анализ
validSchema = StructType([
StructField("type", StringType()),
StructField("geometry", StructType([
StructField("coordinates", StringType()),
StructField("type", StringType(), False)
]), False),
StructField("properties", MapType(StringType(), StringType()))
])
, а затем разобрать его с помощью udf
в три отдельных столбца:
from pyspark.sql.functions import udf
import json
@udf("struct<type: string, coordinates: struct<polygon: array<array<struct<lon: double, lat: double>>>, line: array<struct<lon: double, lat: double>>, point: struct<lon: double, lat: double>>>")
def parse(row):
try:
struct = json.loads(row["coordinates"])
t = row["type"]
except (TypeError, json.decoder.JSONDecodeError):
pass
if t == "Polygon":
return t, (struct, None, None)
elif t == "LineString":
return t, (None, struct, None)
elif t == "Point":
return t, (None, None, struct)
sdf.select(parse("geometry")).show(truncate=False)
# +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
# |parse(geometry) |
# +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
# |[Polygon, [[[[-0.144195556640625, 52.019120643633386], [-0.127716064453125, 52.00052411347729], [-0.10848999023437499, 52.01193653675363], [-0.12359619140625, 52.02883848153626], [-0.144195556640625, 52.019120643633386]]],,]]|
# |[LineString, [, [[-0.196380615234375, 52.11283076186275], [-0.1263427734375, 52.07739600418385]],]] |
# |[Point, [,, [-0.1641082763671875, 52.06051241654061]]] |
# +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+