Я разместил это как комментарий в этом полу-связанном вопросе , но я чувствовал, что ему нужна отдельная запись.
Кто-нибудь знает, где можно найти список допустимых строк для передачи в аргумент 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...
.
Любая помощь очень ценится!