pyspark: допустимые строки для передачи в dataType arg cast () - PullRequest
0 голосов
/ 05 июля 2019

Я разместил это как комментарий в этом полу-связанном вопросе , но я чувствовал, что ему нужна отдельная запись.

Кто-нибудь знает, где можно найти список допустимых строк для передачи в аргумент dataType cast()? Я посмотрел и нахожу такие вещи, как это или это , но никто из них явно не отвечает на вопрос.

Кроме того, я обнаружил методом проб и ошибок, что вы можете передавать такие вещи, как bigint или tinyint, и они, похоже, работают, хотя они нигде не перечислены в качестве допустимых типов данных Spark, по крайней мере, я могу найти. Есть идеи?

Для некоторой воспроизводимости:

df = spark.createDataFrame(
    [
        [18786, "attr1", 0.9743],
        [65747, "attr1", 0.4568],
        [56465, "attr1", 0.6289],
        [18786, "attr2", 0.2976],
        [65747, "attr2", 0.4869],
        [56465, "attr2", 0.8464],
    ],
    ["id", "attr", "val"],
)
print(df)

Это дает вам DataFrame[id: bigint, attr: string, val: double], я думаю, выводя схему по умолчанию.

Затем вы можете сделать что-то вроде этого, чтобы пересчитать типы:

from pyspark.sql.functions import col

fielddef = {'id': 'smallint', 'attr': 'string', 'val': 'long'}
df = df.select([col(c).cast(fielddef[c]) for c in df.columns])
print(df)

А теперь я получаю DataFrame[id: smallint, attr: string, val: bigint], так что, очевидно, 'long' преобразуется в 'bigint'. Я уверен, что есть и другие подобные преобразования.

Кроме того, у меня было странное чувство, что оно будет просто молча игнорировать недействительные строки, которые вы передаете, но это не правда. Когда я попытался передать 'attr': 'varchar' в диктовке fielddef, я получил ошибку DataType varchar is not supported....

Любая помощь очень ценится!

1 Ответ

1 голос
/ 05 июля 2019

Это довольно сложно ответить однозначно, поскольку Spark поддерживает сложные типы (Карты, Массивы, Структуры) произвольной сложности, а также определяемые пользователем типы.Для практических целей DataTypeParserSuite.scala имеет довольно полный набор примеров для примитивных и сложных типов.

Для примитивных типов я адаптировал этот список из visitPrimitiveDataType метода AstBuilder.scala

  • "boolean" -> BooleanType
  • "tinyint" |"byte" -> ByteType
  • "smallint" |"short" -> ShortType
  • "int" |"integer" -> IntegerType
  • "bigint" |"long" -> LongType
  • "float" -> FloatType
  • "double" -> DoubleType
  • "date" -> DateType
  • "отметка времени"-> TimestampType
  • " строка "|"символ (х)" |"varchar (x)" -> StringType
  • "двоичный" -> BinaryType
  • "десятичный" |"десятичное число (х)" |"decimal (xy)" -> DecimalType

Сложные типы - это комбинации самих себя и примитивных типов, например, struct<col1 : timestamp, col2 : bigint, col3 : map<string,array<double>>>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...