相关疑难解决方法(0)

将数组作为Spark SQL中的UDF参数传递

我试图通过一个以数组作为参数的函数来转换数据帧.我的代码看起来像这样:

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

9
推荐指数
1
解决办法
1万
查看次数

使用Java API创建一个简单的1行Spark DataFrame

在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相同)?

java apache-spark spark-dataframe

9
推荐指数
2
解决办法
2万
查看次数