С помощью raw SQL вы можете использовать CONCAT
:
df = sqlContext.createDataFrame([("foo", 1), ("bar", 2)], ("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
import sqlContext.implicits._
val df = sc.parallelize(Seq(("foo", 1), ("bar", 2))).toDF("k", "v")
df.registerTempTable("df")
sqlContext.sql("SELECT CONCAT(k, ' ', v) FROM df")
Начиная с Spark 1.5.0 вы можете использовать функцию concat
с API DataFrame:
from pyspark.sql.functions import concat, col, lit
df.select(concat(col("k"), lit(" "), col("v")))
import org.apache.spark.sql.functions.{concat, lit}
df.select(concat($"k", lit(" "), $"v"))
Также существует функция concat_ws
, которая принимает разделитель строк в качестве первого аргумента.
Вышеприведенные решения работают, но я решил это несколько иначе, используя макрос. Так что на всякий случай здесь:
#define CONNECTCAST(OBJECT,TYPE,FUNC) static_cast<void(OBJECT::*)(TYPE)>(&OBJECT::FUNC)
Добавьте это в свой код.
Затем ваш пример:
QObject::connect(spinBox, &QSpinBox::valueChanged,
slider, &QSlider::setValue);
Становится:
QObject::connect(spinBox, CONNECTCAST(QSpinBox, double, valueChanged),
slider, &QSlider::setValue);
На самом деле вы можете просто обернуть свой слот лямбдой и это:
connect(spinbox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
slider, &QSlider::setValue);
будет выглядеть лучше. : \
Сообщение об ошибке:
Ошибка: нет соответствующей функции для вызова
blockquote>QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))
Важной частью этого является упоминание " неразрешенный перегруженный тип функции ". Компилятор не знает, имеете ли вы
QSpinBox::valueChanged(int)
илиQSpinBox::valueChanged(QString)
.Существует несколько способов разрешения перегрузки:
Предоставить подходящий шаблонный параметр к
connect()
Это заставляетQObject::connect<void(QSpinBox::*)(int)>(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
connect()
разрешить&QSpinBox::valueChanged
перегрузку, которая принимаетint
. Если у вас есть нерешенные перегрузки для аргумента slot, вам нужно будет предоставить второй аргумент шаблонаconnect()
. К сожалению, нет синтаксиса, чтобы попросить, чтобы первый был выведен, поэтому вам нужно будет предоставить оба. Это может помочь второй подход:Использовать временную переменную правильного типа
Назначениеvoid(QSpinBox::*signal)(int) = &QSpinBox::valueChanged; QObject::connect(spinBox, signal, slider, &QSlider::setValue);
signal
выберет желаемую перегрузку, и теперь это может быть успешно заменяется в шаблоне. Это работает одинаково с аргументом «slot», и в этом случае я считаю его менее громоздким.Использовать преобразование
Здесь мы можем избежатьstatic_cast
, так как это просто принуждение, а не устранение защиты языка. Я использую что-то вроде:Это позволяет нам писать// Also useful for making the second and // third arguments of ?: operator agree. template<typename T, typename U> T&& coerce(U&& u) { return u; }
QObject::connect(spinBox, coerce<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), slider, &QSlider::setValue);