मैं DataFrame
स्काला में एक निर्दिष्ट स्कीमा के साथ बनाना चाहता हूं । मैंने JSON रीड (मेरा मतलब खाली फ़ाइल पढ़ने का है) का उपयोग करने की कोशिश की है, लेकिन मुझे नहीं लगता कि यह सबसे अच्छा अभ्यास है।
मैं DataFrame
स्काला में एक निर्दिष्ट स्कीमा के साथ बनाना चाहता हूं । मैंने JSON रीड (मेरा मतलब खाली फ़ाइल पढ़ने का है) का उपयोग करने की कोशिश की है, लेकिन मुझे नहीं लगता कि यह सबसे अच्छा अभ्यास है।
जवाबों:
मान लें कि आप निम्न स्कीमा के साथ एक डेटा फ्रेम चाहते हैं:
root
|-- k: string (nullable = true)
|-- v: integer (nullable = false)
आप केवल डेटा फ्रेम के लिए स्कीमा को परिभाषित करते हैं और खाली का उपयोग करते हैं RDD[Row]
:
import org.apache.spark.sql.types.{
StructType, StructField, StringType, IntegerType}
import org.apache.spark.sql.Row
val schema = StructType(
StructField("k", StringType, true) ::
StructField("v", IntegerType, false) :: Nil)
// Spark < 2.0
// sqlContext.createDataFrame(sc.emptyRDD[Row], schema)
spark.createDataFrame(sc.emptyRDD[Row], schema)
PySpark समकक्ष लगभग समान है:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType
schema = StructType([
StructField("k", StringType(), True), StructField("v", IntegerType(), False)
])
# or df = sc.parallelize([]).toDF(schema)
# Spark < 2.0
# sqlContext.createDataFrame([], schema)
df = spark.createDataFrame([], schema)
निम्न Product
प्रकार के साथ निहित एनकोडर (केवल स्काला) का उपयोग करना Tuple
:
import spark.implicits._
Seq.empty[(String, Int)].toDF("k", "v")
या मामला वर्ग:
case class KV(k: String, v: Int)
Seq.empty[KV].toDF
या
spark.emptyDataset[KV].toDF
स्पार्क 2.0.0 के अनुसार, आप निम्न कार्य कर सकते हैं।
आइए एक Person
केस क्लास को परिभाषित करें :
scala> case class Person(id: Int, name: String)
defined class Person
आयात spark
स्पार्कसेशन निहित Encoders
:
scala> import spark.implicits._
import spark.implicits._
और खाली बनाने के लिए SparkSession का उपयोग करें Dataset[Person]
:
scala> spark.emptyDataset[Person]
res0: org.apache.spark.sql.Dataset[Person] = [id: int, name: string]
तुम भी एक स्कीमा "डीएसएल" का उपयोग करें (देख सकते हैं DataFrames के लिए सहायता कार्यों में org.apache.spark.sql.ColumnName )।
scala> val id = $"id".int
id: org.apache.spark.sql.types.StructField = StructField(id,IntegerType,true)
scala> val name = $"name".string
name: org.apache.spark.sql.types.StructField = StructField(name,StringType,true)
scala> import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructType
scala> val mySchema = StructType(id :: name :: Nil)
mySchema: org.apache.spark.sql.types.StructType = StructType(StructField(id,IntegerType,true), StructField(name,StringType,true))
scala> import org.apache.spark.sql.Row
import org.apache.spark.sql.Row
scala> val emptyDF = spark.createDataFrame(sc.emptyRDD[Row], mySchema)
emptyDF: org.apache.spark.sql.DataFrame = [id: int, name: string]
scala> emptyDF.printSchema
root
|-- id: integer (nullable = true)
|-- name: string (nullable = true)
spark.emptyDataset
मेरे मॉड्यूल पर मौजूद नहीं है, इसका उपयोग कैसे करें? (गैर-सही) के समान कुछ (सही) हैं val df = apache.spark.emptyDataset[RawData]
?
spark
वह मूल्य है जो आप पैकेज के SparkSession.builder
भाग का उपयोग करके बनाते हैं org.apache.spark
। spark
उपयोग में दो नाम हैं। यह spark
आप spark-shell
बॉक्स से बाहर उपलब्ध है ।
import scala.reflect.runtime.{universe => ru}
def createEmptyDataFrame[T: ru.TypeTag] =
hiveContext.createDataFrame(sc.emptyRDD[Row],
ScalaReflection.schemaFor(ru.typeTag[T].tpe).dataType.asInstanceOf[StructType]
)
case class RawData(id: String, firstname: String, lastname: String, age: Int)
val sourceDF = createEmptyDataFrame[RawData]
यहां आप स्कैला में स्ट्रक्चरटेप का उपयोग करके स्कीमा बना सकते हैं और खाली आरडीडी को पास कर सकते हैं ताकि आप खाली टेबल बना सकें। निम्नलिखित कोड उसी के लिए है।
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql._
import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.types.BooleanType
import org.apache.spark.sql.types.LongType
import org.apache.spark.sql.types.StringType
//import org.apache.hadoop.hive.serde2.objectinspector.StructField
object EmptyTable extends App {
val conf = new SparkConf;
val sc = new SparkContext(conf)
//create sparksession object
val sparkSession = SparkSession.builder().enableHiveSupport().getOrCreate()
//Created schema for three columns
val schema = StructType(
StructField("Emp_ID", LongType, true) ::
StructField("Emp_Name", StringType, false) ::
StructField("Emp_Salary", LongType, false) :: Nil)
//Created Empty RDD
var dataRDD = sc.emptyRDD[Row]
//pass rdd and schema to create dataframe
val newDFSchema = sparkSession.createDataFrame(dataRDD, schema)
newDFSchema.createOrReplaceTempView("tempSchema")
sparkSession.sql("create table Finaltable AS select * from tempSchema")
}
खाली डेटासेट बनाने के लिए जावा संस्करण:
public Dataset<Row> emptyDataSet(){
SparkSession spark = SparkSession.builder().appName("Simple Application")
.config("spark.master", "local").getOrCreate();
Dataset<Row> emptyDataSet = spark.createDataFrame(new ArrayList<>(), getSchema());
return emptyDataSet;
}
public StructType getSchema() {
String schemaString = "column1 column2 column3 column4 column5";
List<StructField> fields = new ArrayList<>();
StructField indexField = DataTypes.createStructField("column0", DataTypes.LongType, true);
fields.add(indexField);
for (String fieldName : schemaString.split(" ")) {
StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
fields.add(field);
}
StructType schema = DataTypes.createStructType(fields);
return schema;
}
यहाँ एक समाधान है जो pyspark 2.0.0 या अधिक में एक खाली डेटाफ़्रेम बनाता है।
from pyspark.sql import SQLContext
sc = spark.sparkContext
schema = StructType([StructField('col1', StringType(),False),StructField('col2', IntegerType(), True)])
sqlContext.createDataFrame(sc.emptyRDD(), schema)
स्पार्क 2.4.3 के रूप में
val df = SparkSession.builder().getOrCreate().emptyDataFrame