Потратив много времени на выяснение, почему я получаю следующую ошибку
pyspark: TypeError: IntegerType can not accept object in type <type 'unicode'>
при попытке создать фрейм данных на основе строк и схемы я заметил следующее:
Строка внутри моего rdd с именем rrdRows выглядит следующим образом:
Row(a="1", b="2", c=3)
и моя dfSchema определена как:
dfSchema = StructType([
StructField("c", IntegerType(), True),
StructField("a", StringType(), True),
StructField("b", StringType(), True)
])
создание кадра данных следующим образом:
df = sqlContext.createDataFrame(rddRows, dfSchema)
приводит к вышеупомянутой ошибке, поскольку Spark учитывает только порядок StructFields в схеме и не сопоставляет имя StructFields с именем полей Row.
Другими словами, в приведенном выше примере я заметил, что spark пытается создать фрейм данных, который будет выглядеть следующим образом (если бы не было typeError. e.x, если бы все было типа String)
+---+---+---+
| c | b | a |
+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
это действительно ожидается, или какая-то ошибка?
РЕДАКТИРОВАТЬ: rddRows создаются в соответствии с этими строками:
def createRows(dic):
res = Row(a=dic["a"],b=dic["b"],c=int(dic["c"])
return res
rddRows = rddDict.map(createRows)
где rddDict — проанализированный файл JSON.
rddRows
? - person eliasah   schedule 03.11.2015Row
, как и его аналог в Scala, представляет собой просто кортеж. Это означает, что он имеет фиксированный порядок значений и размер. Все остальное, например, имена или схема (в случае версии Scala) — это просто метаданные. Поскольку строка может вообще не иметь имен или имена в схеме могут отличаться от имен в строках, единственным разумным соответствием является порядок. Это отличается, например, от источника JSON, где порядок не имеет значения, а имена — единственный хороший способ сопоставить записи. - person zero323   schedule 03.11.2015SqlContext.read.json
? - person zero323   schedule 03.11.2015SqlContext.read.json
, но я получаю JSON через сокет внутри Spark Streaming. Насколько я знаю,SqlContext.read.json
можно использовать только для чтения из файла, верно? - person Kito   schedule 03.11.2015RDD[String]
. - person zero323   schedule 04.11.2015