কীভাবে সরাসরি হাইভে ডেটাফ্রেম সংরক্ষণ করবেন?


85

DataFrameমাতালকে সরাসরি স্পার্কে সংরক্ষণ করা সম্ভব ?

আমি রূপান্তর DataFrameকরার চেষ্টা করেছি Rddএবং তারপরে একটি পাঠ্য ফাইল হিসাবে সংরক্ষণ এবং তারপরে মধুচক্রের লোড। তবে আমি ভাবছি যে আমি সরাসরি dataframeহুবহু সংরক্ষণ করতে পারি কিনা

উত্তর:


118

আপনি একটি ইন-মেমরি অস্থায়ী টেবিল তৈরি করতে পারেন এবং এটিকে মাইক্রো টেবিলের মধ্যে sqlContext ব্যবহার করে সংরক্ষণ করতে পারেন।

আপনার ডেটা ফ্রেমটি MyDf বলে দিন। আপনি এটি ব্যবহার করে একটি অস্থায়ী টেবিল তৈরি করতে পারেন,

myDf.createOrReplaceTempView("mytempTable") 

তারপরে আপনি টেমপ্লেট তৈরি করতে এবং আপনার টেম্প টেবিল থেকে ডেটা ডাম্প করতে একটি সাধারণ মাতাল স্টেটমেন্ট ব্যবহার করতে পারেন।

sqlContext.sql("create table mytable as select * from mytempTable");

4
লেখার জন্য লেখার সময় সেভ করা ত্রুটিগুলি পেয়েছিলাম এটি পড়তে শুরু করে 2.0. স্পার্ক 2.0 এ
সাসএস টেবিল

4
হ্যাঁ, যাইহোক, আমরা টেম্প টেবিল তৈরি করার আগে ডেটা ফ্রেমে পার্টিশনটি ব্যবহার করতে পারি। @ ছন্তয়াল
বিনয় কুমার

4
আপনি temporaryটেবিলের সাথে টেবিলটি কীভাবে মিশ্রিত করতে এবং মিলাতে সক্ষম হন hive? show tablesএটি করার সময় কেবলমাত্র hiveআমার spark 2.3.0ইনস্টলেশনের জন্য টেবিলগুলি অন্তর্ভুক্ত থাকে
স্টিফেনবোশ

4
এই অস্থায়ী টেবিলটি আপনার মুরগির প্রসঙ্গে সংরক্ষণ করা হবে এবং কোনওভাবেই মাইনি টেবিলের অন্তর্ভুক্ত নয়।
বিনয় কুমার

4
হাই @ বিনয়কুমার আপনি কেন বলছেন "যদি আপনি সেভএস্টেবল ব্যবহার করছেন (এটি আরও আপনার ডেটাফ্রেমকে টিকিয়ে রাখার মতো), আপনাকে অবশ্যই নিশ্চিত করতে হবে যে আপনার স্পার্ক অ্যাপ্লিকেশনটিতে পর্যাপ্ত মেমরি বরাদ্দ রয়েছে"। আপনি এই বিষয়টি ব্যাখ্যা করতে পারেন?
এনলেপি

28

4
saveAsTable Hive সামঞ্জস্যপূর্ণ সারণী তৈরি করে না। সবচেয়ে ভাল সমাধানটি আমি পেয়েছি বিনয় কুমারের।
আরচ্যাট

@ জেসেক: আমি এই নোটটি নিজেই যুক্ত করেছি, কারণ আমার মনে হয় আমার উত্তরটি ভুল। আমি এটি মুছে ফেলব, এটি গ্রহণ না করা ব্যতীত। আপনি কি মনে করেন নোটটি ভুল?
ড্যানিয়েল দারাবোস

হ্যাঁ. নোটটি ভুল ছিল এবং সে কারণেই আমি এটি সরিয়ে দিয়েছি। "দয়া করে আমি ভুল হলে আমাকে সংশোধন করুন" এখানে প্রযোজ্য :)
জ্যাসেক লাসকভস্কি

4
এই হবে df.write().saveAsTable(tableName) এছাড়াও টেবিল ডেটা স্ট্রিমিং লেখে?
ব্যবহারকারী 1870400

4
না আপনি সেভএস্টেবলের সাহায্যে স্ট্রিমিং ডেটা সংরক্ষণ করতে পারবেন না এটি এপিআইতেও নেই
ব্রায়ান

21

আমি df.write.saveAsTable(...)স্পার্ক ২.০ ডকুমেন্টেশনে অবচয় দেখছি না । এটি আমাজন ইএমআর নিয়ে আমাদের জন্য কাজ করেছে। আমরা এস 3 থেকে ডেটাফ্রেমে ডেটা পড়তে, এটি প্রক্রিয়া করতে, ফলাফল থেকে একটি টেবিল তৈরি করতে এবং মাইক্রোস্ট্রেটজি সহ এটি পড়তে সক্ষম হয়েছি। Vinays উত্তর যদিও কাজ করেছে।


4
দৈর্ঘ্য এবং সামগ্রীর কারণে কেউ এই উত্তরটিকে নিম্ন-মানের হিসাবে পতাকাঙ্কিত করেছে। সত্যি কথা বলতে কি মন্তব্য হিসাবে ভাল হতে পারে। আমার ধারণা এটি দু'বছর ধরে চলেছে এবং কিছু লোক এটির সহায়ক বলে মনে হয়েছে তাই জিনিসগুলি যেমন রেখে দেয় তবে ভাল হতে পারে?
সেরাকফালকন

আমি সম্মত, মন্তব্য আরও ভাল পছন্দ হতে পারে। পাঠ শিখেছি :-)
অ্যালেক্স

15

আপনার একটি HiveContext তৈরি করতে হবে / তৈরি করতে হবে

import org.apache.spark.sql.hive.HiveContext;

HiveContext sqlContext = new org.apache.spark.sql.hive.HiveContext(sc.sc());

তারপরে সরাসরি ডেটাফ্রেম সংরক্ষণ করুন বা মধুচক্রের সারণী হিসাবে সঞ্চয় করতে কলামগুলি নির্বাচন করুন

ডিএফ হ'ল ডেটা ফ্রেম

df.write().mode("overwrite").saveAsTable("schemaName.tableName");

বা

df.select(df.col("col1"),df.col("col2"), df.col("col3")) .write().mode("overwrite").saveAsTable("schemaName.tableName");

বা

df.write().mode(SaveMode.Overwrite).saveAsTable("dbName.tableName");

SaveModes হ'ল সংযোজন / উপেক্ষা / ওভাররাইট / ত্রুটিআইফ্যাক্সস্ট x

আমি এখানে স্পার্ক ডকুমেন্টেশন থেকে HiveContext এর সংজ্ঞা যুক্ত করেছি,

বেসিক এসকিউএল কনটেক্সট ছাড়াও, আপনি একটি হিভকনটেক্সটও তৈরি করতে পারেন, যা বেসিক এসকিউএল কনটেক্সট দ্বারা সরবরাহিত কার্যকারিতার একটি সুপারসেট সরবরাহ করে। অতিরিক্ত বৈশিষ্ট্যগুলির মধ্যে আরও সম্পূর্ণ এইচআইকিউএল পার্সার ব্যবহার করে কোয়েরি লেখার দক্ষতা, মাতাল ইউডিএফগুলিতে অ্যাক্সেস এবং মাতাল টেবিলগুলি থেকে ডেটা পড়ার ক্ষমতা অন্তর্ভুক্ত রয়েছে। একটি HiveContext ব্যবহার করার জন্য, আপনার একটি বিদ্যমান মাইভ সেটআপ করার দরকার নেই এবং একটি এসকিউএল কনটেক্সট-এ উপলব্ধ সমস্ত ডেটা উত্স এখনও উপলব্ধ। ডিফল্ট স্পার্ক বিল্ডে হিভের সমস্ত নির্ভরতা অন্তর্ভুক্ত না করার জন্য শুধুমাত্র এইচআইভি কনটেক্সটকে পৃথকভাবে প্যাকেজ করা হয়।


"dbName.tableName" ব্যবহার করে স্পার্ক সংস্করণ 1.6.2 এ এই ত্রুটি দেয়:

org.apache.spark.sql.AnalysisException: অস্থায়ী সারণীর জন্য ডাটাবেসের নাম বা অন্যান্য যোগ্যতা নির্দিষ্ট করার অনুমতি নেই। যদি টেবিলের নামটিতে বিন্দু (।) থাকে তবে দয়া করে টেবিলের নামটি ব্যাকটিক্স () .` দিয়ে উদ্ধৃত করুন `


দ্বিতীয় কমান্ডটি হ'ল: 'df.select (df.col ("কল 1"), df.col ("কল 2"), df.col ("কল 3")) .writ ()। মোড ("ওভাররাইট")। SaveAsTable ("স্কিমা নাম.ট্যাবলনাম"); ' আপনি আবশ্যক যে নির্বাচিত কলামগুলি ওভাররাইট করতে চান তা ইতিমধ্যে টেবিলটিতে বিদ্যমান? সুতরাং আপনার বিদ্যমান সারণী রয়েছে এবং আপনি কেবলমাত্র বিদ্যমান কলামগুলি 1,2,3 কে আপনার ডিএফ থেকে নতুন ডেটা দিয়ে স্পার্কে ওভাররাইট করতে পারেন? এটা কি ঠিক ব্যাখ্যা করা যায়?
dieHellste

4
df.write().mode...পরিবর্তন করা প্রয়োজনdf.write.mode...
ব্যবহারকারী 923227

8

write()হাইভে সংরক্ষণ করা আপনার এসকিউএল কনটেক্সট এর পদ্ধতিটি ব্যবহার করার বিষয় মাত্র :

df.write.saveAsTable(tableName)

Https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/DataFrameWriter.html#saveAsTable(java.lang.String দেখুন )

স্পার্ক ২.২ থেকে: ডেটাফ্রেমের পরিবর্তে ডেটাসেট ব্যবহার করুন।


আমার মনে হচ্ছে একটি ত্রুটি রয়েছে যা জব বাতিল করে দিয়েছে। । আমি নিচের কোডটি pyspark_df.write.mode ( "ঊর্ধ্বলিপি") saveAsTable ( "InjuryTab2") চেষ্টা
Sade

ওহে! কেন এটা? From Spark 2.2: use DataSet instead DataFrame.
onofricamila

3

দুঃখিত পোস্টটি দেরি করে লিখছি তবে আমি কোনও গ্রহণযোগ্য উত্তর দেখতে পাচ্ছি না।

df.write().saveAsTableছুঁড়ে ফেলবে AnalysisExceptionএবং HIVE টেবিলের সাথে সামঞ্জস্যপূর্ণ নয়।

df.write().format("hive")কৌশলটি ডিএফ হিসাবে সংরক্ষণ করা উচিত!

তবে, যদি এটি কাজ না করে, তবে পূর্ববর্তী মন্তব্য এবং উত্তরগুলি অনুসরণ করে, এটিই আমার মতে সেরা সমাধান (যদিও পরামর্শের জন্য উন্মুক্ত করুন)।

সেরা পদ্ধতির স্পষ্টভাবে এইচআইভি সারণী তৈরি করা (পার্টিশনযুক্ত টেবিল সহ),

def createHiveTable: Unit ={
spark.sql("CREATE TABLE $hive_table_name($fields) " +
  "PARTITIONED BY ($partition_column String) STORED AS $StorageType")
}

টেম্প টেবিল হিসাবে ডিএফ সংরক্ষণ করুন,

df.createOrReplaceTempView("$tempTableName")

এবং পার্টিশনযুক্ত এইচআইবি সারণিতে প্রবেশ করুন:

spark.sql("insert into table default.$hive_table_name PARTITION($partition_column) select * from $tempTableName")
spark.sql("select * from default.$hive_table_name").show(1000,false)

Offcourse শেষ কলামটি ডিএফ থাকবে পার্টিশন কলামটি যাতে মধুচক্র টেবিল অনুযায়ী তৈরি করুন!

যদি এটি কাজ করে মন্তব্য করুন! অথবা না.


--হালনাগাদ--

df.write()
  .partitionBy("$partition_column")
  .format("hive")
  .mode(SaveMode.append)
  .saveAsTable($new_table_name_to_be_created_in_hive)  //Table should not exist OR should be a PARTITIONED table in HIVE

1

Parquet ফাইল থেকে Hive টেবিল তৈরি করতে এখানে পাইস্পার্ক সংস্করণ। আপনি অনুমানকৃত স্কিমা ব্যবহার করে পারকুয়েট ফাইলগুলি তৈরি করেছেন এবং এখন হাইভের মেটাস্টোরের সংজ্ঞা দিতে চান। আপনি AWS আঠালো বা AWS অ্যাথেনার মতো সিস্টেমে সংজ্ঞাটিও চাপ দিতে পারেন এবং কেবলমাত্র হিভ মেটাস্টোরের কাছে নয়। স্থায়ী টেবিলটি চাপ / তৈরি করতে আমি এখানে স্পার্ক.এসকিউএল ব্যবহার করছি।

   # 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);

1

হাইভ বহিরাগত টেবিলগুলির জন্য আমি পাইসপার্কে এই ফাংশনটি ব্যবহার করি:

def save_table(sparkSession, dataframe, database, table_name, save_format="PARQUET"):
    print("Saving result in {}.{}".format(database, table_name))
    output_schema = "," \
        .join(["{} {}".format(x.name.lower(), x.dataType) for x in list(dataframe.schema)]) \
        .replace("StringType", "STRING") \
        .replace("IntegerType", "INT") \
        .replace("DateType", "DATE") \
        .replace("LongType", "INT") \
        .replace("TimestampType", "INT") \
        .replace("BooleanType", "BOOLEAN") \
        .replace("FloatType", "FLOAT")\
        .replace("DoubleType","FLOAT")
    output_schema = re.sub(r'DecimalType[(][0-9]+,[0-9]+[)]', 'FLOAT', output_schema)

    sparkSession.sql("DROP TABLE IF EXISTS {}.{}".format(database, table_name))

    query = "CREATE EXTERNAL TABLE IF NOT EXISTS {}.{} ({}) STORED AS {} LOCATION '/user/hive/{}/{}'" \
        .format(database, table_name, output_schema, save_format, database, table_name)
    sparkSession.sql(query)
    dataframe.write.insertInto('{}.{}'.format(database, table_name),overwrite = True)

1

আমার ক্ষেত্রে এটি কাজ করে:

from pyspark_llap import HiveWarehouseSession
hive = HiveWarehouseSession.session(spark).build()
hive.setDatabase("DatabaseName")
df = spark.read.format("csv").option("Header",True).load("/user/csvlocation.csv")
df.write.format(HiveWarehouseSession().HIVE_WAREHOUSE_CONNECTOR).option("table",<tablename>).save()

সম্পন্ন!!

আপনি ডেটা পড়তে পারেন, আপনাকে "কর্মচারী" হিসাবে দেবেন

hive.executeQuery("select * from Employee").show()

আরও তথ্যের জন্য এই ইউআরএলটি ব্যবহার করুন: https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.5/integrating-hive/content/hive-read-writ-operations.html



-1

যদি আপনি কোনও ডেটাফ্রেম থেকে একটি মাতাল টেবিল তৈরি করতে চান (যা বিদ্যমান নেই) (কিছু সময় এটি দিয়ে তৈরি করতে ব্যর্থ হয় DataFrameWriter.saveAsTable)। StructType.toDDLকলামগুলি স্ট্রিং হিসাবে তালিকাবদ্ধ করতে সহায়তা করবে।

val df = ...

val schemaStr = df.schema.toDDL # This gives the columns 
spark.sql(s"""create table hive_table ( ${schemaStr})""")

//Now write the dataframe to the table
df.write.saveAsTable("hive_table")

hive_tableআমরা কোনও ডাটাবেস সরবরাহ না করায় ডিফল্ট স্পেসে তৈরি করা হবে spark.sql()stg.hive_tableতৈরি করতে ব্যবহার করা যেতে পারে hive_tableযে stgডাটাবেস।


: Detailed উদাহরণ এখানে পাওয়া stackoverflow.com/a/56833395/1592191
mrsrinivas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.