Не очень красиво, но если производительность действительно имеет значение, вы можете предварительно выделить некоторое пространство в стеке.
Если вы уже сейчас используете максимальный размер блока памяти, и вы хотите продолжать проверку переполнения, вы можете сделать что-то вроде:
void f()
{
char array_on_stack[ MAX_BYTES_TO_ALLOCATE ];
SomeType *p = (SomeType *)array;
(...)
}
В первом примере, где вы используете 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]
, который сохраняет указанную схему нетронутой.
Это зависит от того, какой тип файла вы читаете.
Если это 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
Благодарности