[SCALA] 어떻게 지정된 스키마와 빈 DataFrame를 만드는 방법?
SCALA어떻게 지정된 스키마와 빈 DataFrame를 만드는 방법?
나는 스칼라의 지정된 스키마를 DataFrame에 만들려고합니다. 내가 JSON 읽기를 사용하는 것을 시도했다 (I 빈 파일을 읽는 의미)하지만 난 그게 가장 좋은 방법은 생각하지 않습니다.
해결법
-
==============================
1.다음 스키마 데이터 프레임을한다고 가정하자 :
다음 스키마 데이터 프레임을한다고 가정하자 :
root |-- k: string (nullable = true) |-- v: integer (nullable = false)
당신은 단순히 데이터 프레임에 대한 스키마를 정의하고 빈 RDD [행]를 사용 :
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)
튜플 같은 제품 유형 (스칼라 만) 암시 적 인코더를 사용하여 :
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.스파크 2.0.0로, 다음을 수행 할 수 있습니다.
스파크 2.0.0로, 다음을 수행 할 수 있습니다.
의는 사람의 경우 클래스를 정의 할 수 있습니다 :
scala> case class Person(id: Int, name: String) defined class Person
가져 오기 스파크 SparkSession 암시 인코더 :
scala> import spark.implicits._ import spark.implicits._
그리고 빈 데이터 집합 [사람]을 만들 SparkSession를 사용 :
scala> spark.emptyDataset[Person] res0: org.apache.spark.sql.Dataset[Person] = [id: int, name: string]
당신은 또한 (org.apache.spark.sql.ColumnName에 DataFrames에 대한 지원 기능 참조) 스키마 "DSL"을 사용할 수 있습니다.
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)
-
==============================
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]
-
==============================
4.여기 스칼라에 StructType를 사용하여 스키마를 생성하고 그래서 당신이 할 수 빈 테이블을 생성 할 빈 RDD를 전달할 수 있습니다. 코드에 이어 같은입니다.
여기 스칼라에 StructType를 사용하여 스키마를 생성하고 그래서 당신이 할 수 빈 테이블을 생성 할 빈 RDD를 전달할 수 있습니다. 코드에 이어 같은입니다.
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") }
-
==============================
5.여기 pyspark 2.0.0 이상에서 빈 dataframe를 생성하는 솔루션입니다.
여기 pyspark 2.0.0 이상에서 빈 dataframe를 생성하는 솔루션입니다.
from pyspark.sql import SQLContext sc = spark.sparkContext schema = StructType([StructField('col1', StringType(),False),StructField('col2', IntegerType(), True)]) sqlContext.createDataFrame(sc.emptyRDD(), schema)
-
==============================
6.자바 버전은 빈 데이터 집합을 만들 수 있습니다 :
자바 버전은 빈 데이터 집합을 만들 수 있습니다 :
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; }
-
==============================
7.스파크 2.4.3의로
스파크 2.4.3의로
val df = SparkSession.builder().getOrCreate().emptyDataFrame
from https://stackoverflow.com/questions/31477598/how-to-create-an-empty-dataframe-with-a-specified-schema by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 최적화 된 꼬리 재귀 함수를 보장하기 위해 스칼라 주석 무엇입니까? (0) | 2019.11.02 |
---|---|
[SCALA] 어떻게 스파크 스트리밍 방송 변수를 업데이트 할 수 있습니다? (0) | 2019.11.02 |
[SCALA] 접이식 조기 중단 (0) | 2019.11.02 |
[SCALA] 문자열에서 클래스를 생성하고 스칼라 2.10에서 인스턴스화 (0) | 2019.11.02 |
[SCALA] 스칼라 선물 - 시간 제한에 내장? (0) | 2019.11.02 |