একটি নির্দিষ্ট স্কিমা দিয়ে কীভাবে একটি খালি ডেটাফ্রেম তৈরি করবেন?


100

আমি DataFrameস্কালায় একটি নির্দিষ্ট স্কিমা দিয়ে তৈরি করতে চাই । আমি জেএসওএন পঠনটি ব্যবহার করার চেষ্টা করেছি (আমি খালি ফাইলটি পড়তে চাইছি) তবে আমি মনে করি এটি সবচেয়ে ভাল অনুশীলন নয়।

উত্তর:


131

ধরে নেওয়া যাক নীচের স্কিমা সহ আপনি একটি ডেটা ফ্রেম চান:

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)

পাইস্পার্ক সমতুল্য প্রায় অভিন্ন:

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

এটি সর্বাধিক উপযুক্ত উত্তর - সম্পূর্ণ, এবং আপনি যদি কোনও বিদ্যমান ডেটাসেটের স্কিমাটি দ্রুত উত্পাদন করতে চান তবে দরকারী। আমি জানি না কেন এটি গ্রহণযোগ্য নয়।
লুকাস লিমা

কেস ক্লাসের পরিবর্তে বৈশিষ্ট্য দিয়ে কীভাবে ডিএফ তৈরি করবেন: stackoverflow.com/questions/64276952/…
অতিপ্রাকৃত

41

স্পার্ক ২.০.০ হিসাবে, আপনি নিম্নলিখিতটি করতে পারেন।

কেস ক্লাস

আসুন Personকেস ক্লাসটি সংজ্ঞায়িত করা যাক :

scala> case class Person(id: Int, name: String)
defined class Person

আমদানি sparkস্পার্কসেশন অন্তর্ভুক্ত Encoders:

scala> import spark.implicits._
import spark.implicits._

এবং একটি খালি তৈরি করতে স্পার্কসেশন ব্যবহার করুন Dataset[Person]:

scala> spark.emptyDataset[Person]
res0: org.apache.spark.sql.Dataset[Person] = [id: int, name: string]

স্কিমা ডিএসএল

আপনি একটি স্কিমা "ডিএসএল "ও ব্যবহার করতে পারেন ( 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অংশ না ব্যবহার করে আপনি তৈরি করা মান using ব্যবহারের org.apache.sparkদুটি sparkনাম রয়েছে। এটা sparkআপনি উপলব্ধ spark-shellবাক্সের বাইরে।
জ্যাসেক লাসকোভস্কি

4
ধন্যবাদ জেসেক আমি সংশোধন করেছি: স্পার্কসেশন.বিল্ডার অবজেক্টটি প্রথম সাধারণ সূচনা থেকে প্যারামিটার হিসাবে (সর্বোত্তম সমাধান বলে মনে হচ্ছে) এখন চলছে now
পিটার ক্রাউস

আছে: যদি ক্লাসের পরিবর্তে বৈশিষ্ট্য ব্যবহার খালি dataframe তৈরি করতে একটি উপায় আছে কি stackoverflow.com/questions/64276952/...
অতিপ্রাকৃত

3
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]

3

এখানে আপনি স্কেলে স্ট্রাক্টটাইপ ব্যবহার করে স্কিমা তৈরি করতে পারেন এবং খালি আরডিডি পাস করতে পারেন যাতে আপনি খালি টেবিল তৈরি করতে সক্ষম হন। নিম্নলিখিত কোড একই জন্য হয়।

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")

}

2

খালি ডেটাসেট তৈরি করতে জাভা সংস্করণ:

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;
}

1

এখানে একটি সমাধান যা পাইপার্ক ২.০.০ বা তারও বেশি খালি ডেটাফ্রেম তৈরি করে।

from pyspark.sql import SQLContext
sc = spark.sparkContext
schema = StructType([StructField('col1', StringType(),False),StructField('col2', IntegerType(), True)])
sqlContext.createDataFrame(sc.emptyRDD(), schema)


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.