如何使用spark UDF返回复杂类型

时间:2016-09-28 14:33:45

标签: java json apache-spark user-defined-functions udf

您好,并提前感谢您。

我的程序是用java编写的,我无法移动到scala。

我目前正在处理使用以下行从json文件中提取的spark DataFrame:

DataFrame dff = sqlContext.read().json("filePath.son");

SQLContext和SparkContext被正确初始化并完美运行。

问题是json我读取了嵌套结构,我想清理/验证内部数据,而不更改模式。

其中一个数据帧的列特别具有" GenericRowWithSchema"类型。

让我们说我想清理那个名为" data"的专栏。

我想到的解决方案是定义名为" cleanDataField"的用户定义函数(UDF)。然后在列"数据"上运行它。这是代码:

UDF1<GenericRowWithSchema,GenericRowWithSchema> cleanDataField = new UDF1<GenericRowWithSchema, GenericRowWithSchema>(){

        public GenericRowWithSchema call( GenericRowWithSchema grws){

            cleanGenericRowWithSchema(grws);

            return grws;

        }
    };

然后我会在SQLContext中注册该函数:

sqlContext.udf().register("cleanDataField", cleanDataField, DataTypes.StringType);

然后我会打电话给

df.selectExpr("cleanDataField(data)").show(10, false);

为了查看带有干净数据的前10行。

最后,问题导致:我可以返回复杂数据(例如自定义类对象)吗? 如果有可能,我应该怎么做?我想我必须更改udf注册的第3个参数,因为我没有返回一个字符串,但我应该替换它?

谢谢

2 个答案:

答案 0 :(得分:2)

假设您要构建一个数据类型为 TypeError: list[i] is undefined --> item = list[i].split("-");

为此,您可以执行以下操作:

struct<companyid:string,loyaltynum:int,totalprice:int,itemcount:int>

然后,您可以在注册UDF时将该数据类型用作返回类型。

答案 1 :(得分:0)

我不知道您的问题是否仍然有效,但以防万一,这是答案:

您需要将第三个参数替换为set