【问题标题】:Spark sql Dataframe - import sqlContext.implicits._Spark sql Dataframe - 导入 sqlContext.implicits._
【发布时间】:2016-06-15 19:09:04
【问题描述】:

我有创建火花上下文的 main:

    val sc = new SparkContext(sparkConf)
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._

然后创建数据框并对数据框进行过滤和验证。

    val convertToHourly = udf((time: String) => time.substring(0, time.indexOf(':')) + ":00:00")

    val df = sqlContext.read.schema(struct).format("com.databricks.spark.csv").load(args(0))
    // record length cannot be < 2 
    .na.drop(3)
    // round to hours
    .withColumn("time",convertToHourly($"time"))

这很好用。

但是当我尝试通过将数据帧发送到

来将我的验证移动到另一个文件时
function ValidateAndTransform(df: DataFrame) : DataFrame = {...}

获取数据框并进行验证和转换:看来我需要

 import sqlContext.implicits._

为避免错误:“值 $ 不是 StringContext 的成员” 在线发生: .withColumn("time",convertToHourly($"time"))

但是要使用import sqlContext.implicits._ 我还需要在新文件中定义的sqlContext,如下所示:

val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

或发送到

function ValidateAndTransform(df: DataFrame) : DataFrame = {...}
function

我觉得我尝试对 2 个文件(主要和验证)进行的分离没有正确完成......

关于如何设计这个的任何想法?还是干脆将 sqlContext 发送给函数?

谢谢!

【问题讨论】:

  • 当我想分离类似的东西时,我只需在新类的构造函数中传递 SQLContext,然后为每个类导入一次 sqlContext.implicits._。我想不出更好的办法,所以我投票赞成这个问题并等待更好的建议。

标签: apache-spark-sql spark-dataframe


【解决方案1】:

您可以使用 SQLContext 的单例实例。你可以看看spark repository中的这个例子

/** Lazily instantiated singleton instance of SQLContext */
object SQLContextSingleton {

  @transient  private var instance: SQLContext = _

  def getInstance(sparkContext: SparkContext): SQLContext = {
    if (instance == null) {
      instance = new SQLContext(sparkContext)
    }
    instance
  }
}
...
//And wherever you want you can do
val sqlContext = SQLContextSingleton.getInstance(rdd.sparkContext)
import sqlContext.implicits._  

【讨论】:

  • 谢谢!我确实使用了单例对象,但在我的情况下,我希望它只创建一次: object SQLContextSingleton { @transient var instance: SQLContext = _ } 然后从 main 初始化它,并在验证中使用它。感谢您的帮助!
猜你喜欢
  • 2016-04-23
  • 1970-01-01
  • 2017-01-09
  • 2019-09-06
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多