我有一个Dataframe,我想像这样运行一个简单的查询:
def runQuery(df: DataFrame, queryString: String): DataFrame = {
df.createOrReplaceTempView("myDataFrame")
spark.sql(queryString)
}
其中queryString可以是
"SELECT name, age FROM myDataFrame WHERE age > 30"
但我真的很想提前知道查询是否可以正常工作而不必抛出异常。例如,如果df
没有列name
和age
,该怎么办?我想写这样的东西来处理它:
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'声明?
答案 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))
}
来匹配数据类型