有没有办法使用存储在变量中的字符串作为新数据框中的列名?预期结果应该是:
col.name <- 'col1'
df <- data.frame(col.name=1:4)
print(df)
# Real output
col.name
1 1
2 2
3 3
4 4
# Expected output
col1
1 1
2 2
3 3
4 4
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建数据框,然后使用names()重命名列或使用df [,col.name]作为现有对象,但我想知道是否有任何其他解决方案可以在使用过程中使用创建数据框架.
根据DataBrick 的博客,我尝试使用应该在 Spark 1.5 中可用的countDistinct函数。但是,我得到以下异常:
Exception in thread "main" org.apache.spark.sql.AnalysisException: undefined function countDistinct;
Run Code Online (Sandbox Code Playgroud)
我发现在Spark 开发人员的邮件列表中,他们建议使用count和distinct函数来获得应由countDistinct生成的相同结果:
count(distinct <columnName>)
// Instead
countDistinct(<columnName>)
Run Code Online (Sandbox Code Playgroud)
因为我从聚合函数的名称列表中动态构建聚合表达式,所以我希望没有任何需要不同处理的特殊情况。
那么,是否可以通过以下方式统一它:
手动注册已经在 Spark CountDistinct 函数中实现,这可能是以下导入中的一个:
导入 org.apache.spark.sql.catalyst.expressions.{CountDistinctFunction, CountDistinct}
或以任何其他方式做到这一点?
编辑:示例(删除了一些本地引用和不必要的代码):
import org.apache.spark.SparkContext
import org.apache.spark.sql.{Column, SQLContext, DataFrame}
import org.apache.spark.sql.functions._
import scala.collection.mutable.ListBuffer
class Flattener(sc: SparkContext) {
val sqlContext = new SQLContext(sc)
def flatTable(data: DataFrame, groupField: String): DataFrame = {
val flatteningExpressions = data.columns.zip(TypeRecognizer.getTypes(data)).
flatMap(x …Run Code Online (Sandbox Code Playgroud) 以下语法的语法糖等价物是什么:
List[Tuple2[String, Int]] // Base
List[String Tuple2 Int] // Syntactic sugar
Run Code Online (Sandbox Code Playgroud)
对于Tuple3?例如:
List[Tuple3[String, Float, Int]] // Base
Run Code Online (Sandbox Code Playgroud)