Это происходит потому, что структура не кодирует то, что вы имеете в виду.Как объясняется в руководстве по SQL * Python dict
отображается на MapType
.
Для работы со структурами следует использовать вложенные Rows
(namedtuples
предпочтительнее вобщие, но требующие действительные идентификаторы имени ):
from pyspark.sql import Row
Outer = Row("some-column")
Inner = Row("timestamp", "strVal")
spark.createDataFrame([
Outer([Inner(1353534535353, 'some-string')]),
Outer([Inner(1353534535354, 'another-string')])
]).printSchema()
root
|-- some-column: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- timestamp: long (nullable = true)
| | |-- strVal: string (nullable = true)
С имеющейся у вас структурой результат схемы может быть достигнут с промежуточным JSON:
import json
spark.read.json(sc.parallelize(some_data).map(json.dumps)).printSchema()
root
|-- some-column: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- strVal: string (nullable = true)
| | |-- timestamp: long (nullable = true)
или явная схема:
from pyspark.sql.types import *
schema = StructType([StructField(
"some-column", ArrayType(StructType([
StructField("timestamp", LongType()),
StructField("strVal", StringType())])
))])
spark.createDataFrame(some_data, schema)
, хотя последний метод может быть не совсем устойчивым.