Действительно, VectorAssembler Transformer не принимает строки. Поэтому вам нужно убедиться, что ваши столбцы соответствуют числовым, логическим, векторным типам. Убедитесь, что ваш udf работает правильно и убедитесь, что ни один из столбцов не имеет StringType.
Чтобы преобразовать столбец в Spark DataFrame в другой тип, сделайте его простым и используйте функцию DSL () DSL так:
val analysisData = dataframe_mysql.withColumn("Event", dataframe_mysql("Event").cast(DoubleType))
Он должен работать!
Java использует неявную семантику указателя для Типов объектов и семантику значения для примитивов.
семантика Значения означает, что Вы имеете дело непосредственно со значениями и что Вы раздаете копии. Точка здесь - то, что, когда у Вас есть значение, можно положить, что оно не изменится за спиной.
С семантикой указателя, у Вас нет значения, у Вас есть 'адрес'. Кто-то еще мог изменить то, что там, Вы не можете знать.
Семантика Указателя в C++:
void foo(Bar * b) ...
... b->bar() ...
Вам нужно *, чтобы попросить семантику указателя и-> называть методы на пуанте.
Неявная Семантика Указателя в Java:
void foo(Bar b) ...
... b.bar() ...
, Так как у Вас нет выбора использования семантики значения, *, не необходим, ни различие между-> и., следовательно неявное.
В основном семантика значения означает, что присвоение одного значения другому создает копию:
int x = 1;
int y = x;
x = 2; // y remains the same!
особый случай А является вызовом функции, который передается аргумент:
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
Это - на самом деле то же для Java и C++. Однако Java знает только несколько типов примитивов, среди них int
, double
, boolean
и char
, наряду с перечислениями, которые ведут себя этим способом. Все другие типы используют ссылочную семантику, что означает, что присвоение одного значения другому на самом деле перенаправляет указатель вместо того, чтобы копировать базовое значение:
class Foo {
int x;
public Foo(int x) { this.x = x; }
}
Foo a = new Foo(42);
Foo b = a; // b and a share the same instance!
a.x = 32;
//b.x is now also changed.
существует несколько протестов как бы то ни было. Например, много ссылочных типов (String
, Integer
†¦) на самом деле immutables. Их значение не может быть изменено, и любое присвоение на них переопределяет старое значение.
кроме того, аргументы все еще передаются значением. Это означает, что значение объекта, переданного функции, может быть изменено, но ее ссылка не может:
void f(Foo foo) {
foo.x = 42;
}
void g(Foo foo) {
foo = new Foo(42);
}
Foo a = new Foo(23);
f(a);
// a.x is now 42!
Foo b = new Foo(1);
g(b);
// b remains unchanged!
Java является передачей значением. C++ может использовать обоих, значение и ссылочную семантику.
Использование Java implicit pointer semantics
на переменный доступ (Вы не можете непосредственно отредактировать ссылку, это autmatically (неявный), разрешен к Объекту на доступе), и также использует Pass-by-Value semantics
на параметры метода, передающие .
семантика Read Передачи значением в JAVA-приложениях :
В JAVA-приложениях, когда ссылка на объект является параметром к методу, Вы передаете копию ссылки (передача значением), не самой ссылки. Обратите внимание, что ссылка на объект вызывающего метода и копия указывают на тот же объект. Это - важное различие. JAVA-приложение ничего не делает по-другому, когда передающие параметры переменных типов как C++ делают. JAVA-приложения передают все параметры значением, таким образом делая копии всех параметров независимо от типа.
Короткий: Все параметры в Java передаются значением. Но это не означает, что Объект копируется (как значение по умолчанию в PHP4), но ссылка на тот объект копируется.
Вы будете видеть все объяснения и всесторонние примеры на семантика Передачи значением в JAVA-приложениях