测试sparksql查询

时间:2018-06-12 15:33:35

标签: scala apache-spark dataframe apache-spark-sql

我有一个Dataframe,我想像这样运行一个简单的查询:

def runQuery(df: DataFrame, queryString: String): DataFrame = {

    df.createOrReplaceTempView("myDataFrame")
    spark.sql(queryString)

}

其中queryString可以是

"SELECT name, age FROM myDataFrame WHERE age > 30"

但我真的很想提前知道查询是否可以正常工作而不必抛出异常。例如,如果df没有列nameage,该怎么办?我想写这样的东西来处理它:

def runQuery(df: DataFrame, queryString: String): DataFrame = {

    if (/*** df and queryString are compatible ***/) {
        df.createOrReplaceTempView("myDataFrame")
        spark.sql(queryString)
    } else {
        spark.createDataFrame(sc.emptyRDD[Row], df.schema)
    }

}

有没有办法在' if'声明?

2 个答案:

答案 0 :(得分:1)

我不会太担心例外情况。只需用Try包裹它:

import scala.util.Try
import org.apache.spark.sql.catalyst.encoders.RowEncoder

def runQuery(df: DataFrame, queryString: String): DataFrame = Try {
  df.createOrReplaceTempView("myDataFrame")
  df.sparkSession.sql(queryString)
}.getOrElse(df.sparkSession.emptyDataset(RowEncoder(df.schema)))

答案 1 :(得分:0)

您可以使用触发火花作业

来检查数据框中是否存在所有列
int main()
{double deg;
int num;
cin>>deg;
double x=deg*3.141592654/180;
double term=0;
double cur=x;   current term
double result=x;
double s=cos(x);
cout<<s<<endl;

for(int n=0;;n++){
term=cur*(-x*x/(2*n+2)*(2*n+1));

if(abs(term-cur)< eps){
    cout << result << endl;
return 0;
}
  else{
     result+=term;
     cur=term;
  }


}
    cout << result << endl;
    return 0;
}

您可以使用 def runQuery(df: DataFrame, queryString: String): DataFrame = if(Array("name", "age", "address").forall(df.columns.contains)) { df.createOrReplaceTempView("myDataFrame") df.sparkSession.sql(queryString) } else { df.sparkSession.emptyDataset(RowEncoder(df.schema)) } 来匹配数据类型