2015-06-30 2 views
5

Я использую библиотеки искры в Scala. Я создал DataFrame используяScala DataFrame: Explode array

val searchArr = Array(
    StructField("log",IntegerType,true), 
    StructField("user", StructType(Array(
    StructField("date",StringType,true), 
    StructField("ua",StringType,true), 
    StructField("ui",LongType,true))),true), 
    StructField("what",StructType(Array(
    StructField("q1",ArrayType(IntegerType, true),true), 
    StructField("q2",ArrayType(IntegerType, true),true), 
    StructField("sid",StringType,true), 
    StructField("url",StringType,true))),true), 
    StructField("where",StructType(Array(
    StructField("o1",IntegerType,true), 
    StructField("o2",IntegerType,true))),true) 
) 

val searchSt = new StructType(searchArr)  

val searchData = sqlContext.jsonFile(searchPath, searchSt) 

Я теперь, что взрываются поле what.q1, который должен содержать массив целых чисел, но документация ограничена: http://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/sql/DataFrame.html#explode(java.lang.String,%20java.lang.String,%20scala.Function1,%20scala.reflect.api.TypeTags.TypeTag)

До сих пор я попробовал несколько вещей без большой удачи

val searchSplit = searchData.explode("q1", "rb")(q1 => q1.getList[Int](0).toArray()) 

Любые идеи/примеры использования взрыва на массиве?

ответ

0

Вы пытались использовать UDF на поле «что»? Нечто подобное может быть полезно:

val explode = udf { 
(aStr: GenericRowWithSchema) => 
    aStr match { 
     case null => "" 
     case _ => aStr.getList(0).get(0).toString() 
    } 
} 


val newDF = df.withColumn("newColumn", explode(col("what"))) 

где:

  • GetList (0) возвращает поле "q1"
  • прибудете (0) возвращает первый элемент "q1"

Я не уверен, но вы могли бы попытаться использовать getAs [T] (fieldName: String) вместо getList (индекс: Int).