Je souhaite créer une table Hive à l'aide du schéma de mon cadre de données Spark. Comment puis je faire ça?
Pour les colonnes fixes, je peux utiliser:
val CreateTable_query = "Create Table my table(a string, b string, c double)"
sparksession.sql(CreateTable_query)
Mais j'ai beaucoup de colonnes dans mon dataframe, alors est-il possible de générer automatiquement une telle requête?
En supposant que vous utilisez Spark 2.1.0 ou version ultérieure et my_DF est votre cadre de données,
//get the schema split as string with comma-separated field-datatype pairs
StructType my_schema = my_DF.schema();
StructField[] fields = my_schema.fields();
String fieldStr = "";
for (StructField f : fields) {
fieldStr += f.name() + " " + f.dataType().typeName() + ",";
}
//drop the table if already created
spark.sql("drop table if exists my_table");
//create the table using the dataframe schema
spark.sql("create table my_table(" + fieldStr.subString(0,fieldStr.length()-1)+
") row format delimited fields terminated by '|' location '/my/hdfs/location'");
//write the dataframe data to the hdfs location for the created Hive table
my_DF.write()
.format("com.databricks.spark.csv")
.option("delimiter","|")
.mode("overwrite")
.save("/my/hdfs/location");
L'autre méthode utilisant la table temp
my_DF.createOrReplaceTempView("my_temp_table");
spark.sql("drop table if exists my_table");
spark.sql("create table my_table as select * from my_temp_table");
Selon votre question, il semble que vous souhaitiez créer une table dans Hive à l'aide du schéma de votre cadre de données. Mais comme vous dites que vous avez beaucoup de colonnes dans ce cadre de données, il y a donc deux options
Considérons ce code:
package Hive.example
import org.Apache.spark.SparkConf
import org.Apache.spark.SparkContext
import org.Apache.spark.sql.SQLContext
import org.Apache.spark.sql.Row
import org.Apache.spark.sql.SparkSession
object checkDFSchema extends App {
val cc = new SparkConf;
val sc = new SparkContext(cc)
val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
//First option for creating Hive table through dataframe
val DF = sparkSession.sql("select * from salary")
DF.createOrReplaceTempView("tempTable")
sparkSession.sql("Create table yourtable as select * form tempTable")
//Second option for creating Hive table from schema
val oldDFF = sparkSession.sql("select * from salary")
//Generate the schema out of dataframe
val schema = oldDFF.schema
//Generate RDD of you data
val rowRDD = sc.parallelize(Seq(Row(100, "a", 123)))
//Creating new DF from data and schema
val newDFwithSchema = sparkSession.createDataFrame(rowRDD, schema)
newDFwithSchema.createOrReplaceTempView("tempTable")
sparkSession.sql("create table FinalTable AS select * from tempTable")
}
Voici la version de PySpark pour créer une table Hive à partir d'un fichier de parquet. Vous avez peut-être généré des fichiers Parquet à l'aide d'un schéma inféré et souhaitez maintenant transmettre la définition au métastore Hive. Vous pouvez également transmettre la définition au système, comme AWS Glue ou AWS Athena, et pas seulement à Hive metastore. Ici, j'utilise spark.sql pour pousser/créer une table permanente.
# Location where my parquet files are present.
df = spark.read.parquet("s3://my-location/data/")
cols = df.dtypes
buf = []
buf.append('CREATE EXTERNAL TABLE test123 (')
keyanddatatypes = df.dtypes
sizeof = len(df.dtypes)
print ("size----------",sizeof)
count=1;
for eachvalue in keyanddatatypes:
print count,sizeof,eachvalue
if count == sizeof:
total = str(eachvalue[0])+str(' ')+str(eachvalue[1])
else:
total = str(eachvalue[0]) + str(' ') + str(eachvalue[1]) + str(',')
buf.append(total)
count = count + 1
buf.append(' )')
buf.append(' STORED as parquet ')
buf.append("LOCATION")
buf.append("'")
buf.append('s3://my-location/data/')
buf.append("'")
buf.append("'")
##partition by pt
tabledef = ''.join(buf)
print "---------print definition ---------"
print tabledef
## create a table using spark.sql. Assuming you are using spark 2.1+
spark.sql(tabledef);