我试图通过一个以数组作为参数的函数来转换数据帧.我的代码看起来像这样:
def getCategory(categories:Array[String], input:String): String = {
categories(input.toInt)
}
val myArray = Array("a", "b", "c")
val myCategories =udf(getCategory _ )
val df = sqlContext.parquetFile("myfile.parquet)
val df1 = df.withColumn("newCategory", myCategories(lit(myArray), col("myInput"))
Run Code Online (Sandbox Code Playgroud)
但是,lit不喜欢数组和这个脚本错误.我尝试定义一个新的部分应用函数,然后是udf:
val newFunc = getCategory(myArray, _:String)
val myCategories = udf(newFunc)
val df1 = df.withColumn("newCategory", myCategories(col("myInput")))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我得到一个nullPointer异常,并且看起来myArray未被识别.关于如何将数组作为参数传递给具有数据帧的函数的任何想法?
另外,关于为什么做一些简单的事情(比如在数据帧上使用函数)的任何解释都是如此复杂(定义函数,将其重新定义为UDF等等)?
scala user-defined-functions dataframe apache-spark apache-spark-sql
在Scala中,我可以从内存中的字符串创建单行DataFrame,如下所示:
val stringAsList = List("buzz")
val df = sqlContext.sparkContext.parallelize(jsonValues).toDF("fizz")
df.show()
Run Code Online (Sandbox Code Playgroud)
当df.show()运行时,它输出:
+-----+
| fizz|
+-----+
| buzz|
+-----+
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试从Java类中执行此操作.显然JavaRDDs没有toDF(String)方法.我试过了:
List<String> stringAsList = new ArrayList<String>();
stringAsList.add("buzz");
SQLContext sqlContext = new SQLContext(sparkContext);
DataFrame df = sqlContext.createDataFrame(sparkContext
.parallelize(stringAsList), StringType);
df.show();
Run Code Online (Sandbox Code Playgroud)
......但似乎仍然很短暂.现在df.show();执行时,我得到:
++
||
++
||
++
Run Code Online (Sandbox Code Playgroud)
(一个空的DF.)所以我问:使用Java API,如何将内存中的字符串读入一个只有1行1列的DataFrame中,并指定该列的名称?(这df.show()与上面的Scala相同)?