2016-07-04 19 views
1

我在星火加载的JSON文件,大致,它看起来像:加工定制(Java)的

root 
|-- datasetid: string (nullable = true) 
|-- fields: struct (nullable = true) 
... 
| |-- type_description: string (nullable = true) 

我DF是把它变成:

df = df.withColumn("desc", df.col("fields.type_description")); 

所有罚款,但type_description的值看起来像:“1 - 我的描述类型”。

理想情况下,我想让我的df仅包含文本部分,例如“我的描述类型”。我知道如何做到这一点,但我怎样才能通过Spark?

我沿着线的一些希望:

df = df.withColumn("desc", df.col("fields.type_description").call(/* some kind of transformation class/method*/)); 

谢谢!

+0

那么你究竟在寻找什么?正则表达式?子?你能否更新这个问题来反映这个问题? – zero323

+0

理想情况下,它可能是任何东西......在这种情况下,我会管理一个子字符串和修剪(从来没有超过2位数字)......但我有其他更有趣的情况,如解析,列之间的值的串联,打电话给乔达时代等。 – jgp

回答

1

一般来说,Spark提供了一系列广泛的SQL函数,它们从基本的字符串处理实用程序,日期/时间处理函数到不同的统计摘要都有所不同。这是o.a.s.sql.functions的一部分。在这种特殊情况下,您可能需要这样的东西:

import static org.apache.spark.sql.functions.*; 

df.withColumn("desc", 
    regexp_replace(df.col("fields.type_description"), "^[0-9]*\\s*-\\s*", "") 
); 

一般来说,这些函数应该是您使用Spark SQL时的首选。有Catalyst表达式支持,通常提供codegen实用程序。这意味着您可以从不同的Spark SQL优化中充分受益。

替代方法,但效率较低的方法是实现自定义UDF。例如见Creating a SparkSQL UDF in Java outside of SQLContext

+1

太棒了 - 我看到我们可以用Python做UDF,但我真的很高兴我们也可以用Java来做到这一点! TX! – jgp