Знает ли фрейм данных тип столбца?

Не очень красиво, но если производительность действительно имеет значение, вы можете предварительно выделить некоторое пространство в стеке.

Если вы уже сейчас используете максимальный размер блока памяти, и вы хотите продолжать проверку переполнения, вы можете сделать что-то вроде:

void f()
{
    char array_on_stack[ MAX_BYTES_TO_ALLOCATE ];
    SomeType *p = (SomeType *)array;

    (...)
}
-2
задан Wayne 17 January 2019 в 01:28
поделиться

2 ответа

В первом примере, где вы используете rdd.toDF("name", "age"), вы явно не предоставляете схему для DataFrame. И DataFrames на самом деле просто DataSet[Row]. Следовательно, Spark выбирает наилучший тип данных на основе данных (int на основе 1 и 2).

Во втором примере вы создаете DataSet, который сохраняет тип данных на основе предоставленной схемы. Итак:

val ds = rdd.map(line => Person(line._1,line._2) ).toDS()

Создает DataSet[Person], который сохраняет указанную схему нетронутой.

0
ответ дан philantrovert 17 January 2019 в 01:28
поделиться

Это зависит от того, какой тип файла вы читаете.

Если это CSV-файл без заголовка, вам необходимо указать имя столбца и тип данных, используя схему.

Это CSV-файл с заголовком, поэтому вам нужно использовать «inferSchema» -> «true» в качестве опции при чтении файла. Эта опция автоматически выводит схему и типы данных. Однако тип данных автоматически определяется на основе первых нескольких записей фактических данных.

val df = spark.read.options(Map("inferSchema"->"true","delimiter"->"|","header"->"true")).csv(filePath)

По любой причине, если ваши первые несколько записей столбца имеют целочисленное значение, а другие записи имеют строку, то у вас возникнут проблемы, поэтому всегда рекомендуется явно указывать схему. [ 117]

Ваш код работает как положено.

Нижеприведенный оператор автоматически выводит тип данных в Int для возраста на основе данных Seq (("aa", 1), ("bb", 2))

val df = rdd.toDF("name","age")

Однако, когда вы конвертируете Dataframe в набор данных

val ds = rdd.map(line =>{Person(line._1,line._2)}).toDS()

Здесь вы конвертируете в Person, который имеет тип данных Long для поля возраста, следовательно, вы видите его длинным, как и ожидалось. Обратите внимание, что автоматическое преобразование из Int в Long выполняется Scala (приведение вверх), а не Spark.

Надеюсь, это прояснится !!

Ниже приведена хорошая информация о том, как предоставить сложную схему. надеюсь, это даст вам больше идей.

https://medium.com/@mrpowers/adding-structtype-columns-to-spark-dataframes-b44125409803

Благодарности

0
ответ дан Naveen Nelamali 17 January 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: