Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-01-2016 11:26 AM
I found a satisfying solution. Instead of using a return type of Array[Typle4[...]], I used a case class to create a simple structure:
case class Result (
f_int : Int,
f_string : String,
f_float : Float,
f_ts : Timestamp
);
def foo2(p1 :Integer, p2 :Integer) : Array[Result] =
{
val result = Array(
Result(1, "1", 1.1f, new Timestamp(2014, 4, 17, 1, 0, 0, 0)),
Result(2, "2", 2.2f, new Timestamp(2014, 4, 17, 2, 0, 0, 0)),
Result(3, "3", 3.3f, new Timestamp(2014, 4, 17, 3, 0, 0, 0))
);
return result;
}
sqlContext.udf.register("foo2", foo2 _);
sqlContext.sql("""
select
a.foo_output.f_int as f_int
, a.foo_output.f_float as f_float
, a.foo_output.f_string as f_string
, a.foo_output.f_ts as f_datetime
from (select explode(foo2(1, 7)) as foo_output) a
""").show()
This seemed to give the desired output and is the same as pyspark.
I'm still curious as to how to explicitly return a array of tuples. The fact that I got it to work in pyspark lends evidence to the existence of a way to accomplish the same thing in scala/spark.
Any thoughts?