我有一个名为数组列表的数组,看起来像这样
arraylist: Array[(String, Any)] = Array((id,772914), (x4,2), (x5,24), (x6,1), (x7,77491.25), (x8,17911.77778), (x9,225711), (x10,17), (x12,6), (x14,5), (x16,5), (x18,5.0), (x19,8.0), (x20,7959.0), (x21,676.0), (x22,228.5068871), (x23,195.0), (x24,109.6015511), (x25,965.0), (x26,1017.79043), (x27,2.0), (Target,1), (x29,13), (x30,735255.5), (x31,332998.432), (x32,38168.75), (x33,107957.5278), (x34,13), (x35,13), (x36,13), (x37,13), (x38,13), (x39,13), (x40,13), (x41,7), (x42,13), (x43,13), (x44,13), (x45,13), (x46,13), (x47,13), (x48,13), (x49,14.0), (x50,2.588435821), (x51,617127.5), (x52,414663.9738), (x53,39900.0), (x54,16743.15781), (x55,105000.0), (x56,52842.29076), (x57,25750.46154), (x58,8532.045819), (x64,13), (x66,13), (x67,13), (x68,13), (x69,13), (x70,13), (x71,13), (x73,13), (...
我想将其转换为具有两列的数据帧" ID"和价值。这就是我正在使用的代码
val df = sc.parallelize(arraylist).toDF("Names","Values")
但是我收到错误
java.lang.UnsupportedOperationException: Schema for type Any is not supported
我该如何克服这个问题?
答案 0 :(得分:7)
消息告诉您所有内容:)任何不支持作为DataFrame列的类型。 Any
类型可以由null作为元组的第二个元素
将arraylist类型更改为Array[(String, Int)]
(如果您可以手动执行;如果Scala将其扣除,则检查第二个元素的空值和无效值)或手动创建架构:
import org.apache.spark.sql.types._
import org.apache.spark.sql._
val arraylist: Array[(String, Any)] = Array(("id",772914), ("x4",2.0), ("x5",24.0));
val schema = StructType(
StructField("Names", StringType, false) ::
StructField("Values", DoubleType, false) :: Nil)
val rdd = sc.parallelize (arraylist).map (x => Row(x._1, x._2.asInstanceOf[Number].doubleValue()))
val df = sqlContext.createDataFrame(rdd, schema)
df.show()
注意:createDataFrame需要RDD [Row],所以我将元组的RDD转换为Row的RDD
答案 1 :(得分:2)
问题(如上所述)是Any不是数据框架的合法类型。一般来说,合法类型是基本类型(byte,int,boolean,string,double等),合法类型的结构,合法类型的数组和合法类型的地图
在你的情况下,似乎你在元组的第二个值中使用了整数和双精度。如果您只使用双倍,那么它应该正常工作。
你可以通过两种方式做到这一点: 1.确保原始数组只有两倍(例如,在创建它时在每个整数的末尾添加.0)或通过执行转换 2.实施架构:
import org.apache.spark.sql.types._
val schema = new StructType()
schema.add(StructField("names",StringType))
schema.add(StructField("values",DoubleType))
val rdd = sc.parallelize(arraylist).map (x => Row(x._1, x._2.asInstanceOf[Number].doubleValue()))
val df = spark.createDataFrame(rdd,schema)