import os
import sys
spark_home = os.environ.get('SPARK_HOME', None)
sys.path.insert(0, spark_home + "/python")
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.10.4-src.zip'))
Здесь это происходит ....
sys.path.insert(0, <PATH TO YOUR JAR>)
Затем ...
import pyspark
import numpy as np
from pyspark import SparkContext
sc = SparkContext("local[1]")
.
.
.
Нет. Стандарт C ++ 03 гласит:
[Примечание: поскольку явный список аргументов шаблона следует за именем шаблона функции, и поскольку шаблоны функций-членов преобразования и шаблоны функций-членов конструктора вызываются без использования имени функции, невозможно предоставить явный список аргументов шаблона для этих шаблонов функций.] (§14.5.2 / 5)
Существует еще одно решение для передачи информации о типе шаблонным конструкторам, которые не могут принимать значение этого типа в качестве аргумента:
template<class T>
struct id
{};
struct A {
template<class T>
A(id<T>);
};
A a=id<int>();
Редактировать:
Обратите внимание: A a(id<int>());
не будет работать из-за самого неприятного анализа. Это будет интерпретировано как объявление функции. См. этот вопрос для дальнейшего объяснения.
В качестве обходного пути: вы можете определить шаблонную статическую фабричную функцию, которая, в свою очередь, будет возвращать экземпляр, используя закрытый конструктор.
struct A {
template<typename T>
static A create() {
return A();
}
private:
A() {}
};
Затем вы получаете новые экземпляры A, такие как:
auto a1 = A::create<int>();
auto a2 = A::create<long>();
нет, вы не можете инстанцировать этот класс, используя этот конструктор. НО:
struct A
{
template < typename T >
A(T const&);
};
Теперь можете.