如果我想从case class
中创建一个StructType
(即DataFrame.schema
),有没有办法不创建DataFrame
?我可以很容易地做到:
case class TestCase(id: Long)
val schema = Seq[TestCase]().toDF.schema
字符串
但是,当我只需要模式时,实际创建DataFrame
似乎有些多余。
(If你很好奇,这个问题背后的原因是我定义了一个UserDefinedAggregateFunction
,为了这样做,你覆盖了两个返回StructTypes
的方法,我使用了case类。
4条答案
按热度按时间fkvaft9z1#
你可以用
SQLContext.createDataFrame
的方法来做:字符串
gtlvzcf82#
我知道这个问题已经快一年了,但我遇到了它,并认为其他人也可能想知道我刚刚学会使用这种方法:
字符串
dgjrabp23#
如果有人想为自定义Java Bean这样做:
字符串
sycxhyv74#
与其手动复制用于创建传递给
toDF
的隐式Encoder
对象的逻辑,我们可以直接使用它(或者更准确地说,以与toDF
相同的方式隐式地使用它):字符串
不幸的是,这实际上遇到了与其他答案中使用
org.apache.spark.sql.catalyst
或Encoders
相同的问题:Encoder
特性是实验性的。这是如何工作的?
Seq
上的toDF
方法来自DatasetHolder
,它是通过spark.implicits._
导入的隐式localSeqToDatasetHolder
创建的。该函数的定义如下:型
如您所见,它接受一个
implicit
Encoder[T]
参数,对于case class
,可以通过newProductEncoder
计算该参数(也通过spark.implicits._
导入)。我们可以通过方便的scala.Predef.implicitly
来重现这个隐式逻辑,为我们的case类获取一个Encoder
。(默认情况下在作用域中,因为它来自Predef
),它将只返回其请求的隐式参数:型