Ett*_*Gur 14 apache-spark-sql spark-dataframe
我有main创建spark上下文:
val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
Run Code Online (Sandbox Code Playgroud)
然后创建数据帧并对数据帧进行过滤和验证.
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"))
Run Code Online (Sandbox Code Playgroud)
这非常有效.
但是当我尝试通过发送数据帧将我的验证移动到另一个文件时
function ValidateAndTransform(df: DataFrame) : DataFrame = {...}
Run Code Online (Sandbox Code Playgroud)
获取Dataframe并进行验证和转换:似乎我需要
import sqlContext.implicits._
Run Code Online (Sandbox Code Playgroud)
为了避免错误:"value $不是StringContext的成员"在线发生:.withColumn("time",convertToHourly($ "time"))
但要使用 import sqlContext.implicits._
我还需要sqlContext在新文件中定义,如下所示:
val sc = new SparkContext(sparkConf)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
Run Code Online (Sandbox Code Playgroud)
或发送给
function ValidateAndTransform(df: DataFrame) : DataFrame = {...}
function
Run Code Online (Sandbox Code Playgroud)
我觉得我试图对2个文件(主要和验证)做的分离没有正确完成...
关于如何设计这个的任何想法?或者只是将sqlContext发送给函数?
谢谢!
Mar*_*rco 14
您可以使用SQLContext的单例实例.您可以在spark存储库中查看此示例
/** 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._
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23651 次 |
| 最近记录: |