DataFrame
মাতালকে সরাসরি স্পার্কে সংরক্ষণ করা সম্ভব ?
আমি রূপান্তর DataFrame
করার চেষ্টা করেছি Rdd
এবং তারপরে একটি পাঠ্য ফাইল হিসাবে সংরক্ষণ এবং তারপরে মধুচক্রের লোড। তবে আমি ভাবছি যে আমি সরাসরি dataframe
হুবহু সংরক্ষণ করতে পারি কিনা
উত্তর:
আপনি একটি ইন-মেমরি অস্থায়ী টেবিল তৈরি করতে পারেন এবং এটিকে মাইক্রো টেবিলের মধ্যে sqlContext ব্যবহার করে সংরক্ষণ করতে পারেন।
আপনার ডেটা ফ্রেমটি MyDf বলে দিন। আপনি এটি ব্যবহার করে একটি অস্থায়ী টেবিল তৈরি করতে পারেন,
myDf.createOrReplaceTempView("mytempTable")
তারপরে আপনি টেমপ্লেট তৈরি করতে এবং আপনার টেম্প টেবিল থেকে ডেটা ডাম্প করতে একটি সাধারণ মাতাল স্টেটমেন্ট ব্যবহার করতে পারেন।
sqlContext.sql("create table mytable as select * from mytempTable");
temporary
টেবিলের সাথে টেবিলটি কীভাবে মিশ্রিত করতে এবং মিলাতে সক্ষম হন hive
? show tables
এটি করার সময় কেবলমাত্র hive
আমার spark 2.3.0
ইনস্টলেশনের জন্য টেবিলগুলি অন্তর্ভুক্ত থাকে
ব্যবহার DataFrameWriter.saveAsTable
। ( df.write.saveAsTable(...)
) স্পার্ক এসকিউএল এবং ডেটাফ্রেম গাইড দেখুন ।
df.write().saveAsTable(tableName)
এছাড়াও টেবিল ডেটা স্ট্রিমিং লেখে?
আমি df.write.saveAsTable(...)
স্পার্ক ২.০ ডকুমেন্টেশনে অবচয় দেখছি না । এটি আমাজন ইএমআর নিয়ে আমাদের জন্য কাজ করেছে। আমরা এস 3 থেকে ডেটাফ্রেমে ডেটা পড়তে, এটি প্রক্রিয়া করতে, ফলাফল থেকে একটি টেবিল তৈরি করতে এবং মাইক্রোস্ট্রেটজি সহ এটি পড়তে সক্ষম হয়েছি। Vinays উত্তর যদিও কাজ করেছে।
আপনার একটি 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.write().mode...
পরিবর্তন করা প্রয়োজনdf.write.mode...
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 দেখুন )
স্পার্ক ২.২ থেকে: ডেটাফ্রেমের পরিবর্তে ডেটাসেট ব্যবহার করুন।
From Spark 2.2: use DataSet instead DataFrame.
দুঃখিত পোস্টটি দেরি করে লিখছি তবে আমি কোনও গ্রহণযোগ্য উত্তর দেখতে পাচ্ছি না।
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
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);
হাইভ বহিরাগত টেবিলগুলির জন্য আমি পাইসপার্কে এই ফাংশনটি ব্যবহার করি:
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)
আমার ক্ষেত্রে এটি কাজ করে:
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
আপনি এই জাতীয় উদ্যানগুলি স্পার্ক-ল্যাপ লাইব্রেরি ব্যবহার করতে পারেন
import com.hortonworks.hwc.HiveWarehouseSession
df.write
.format("com.hortonworks.spark.sql.hive.llap.HiveWarehouseConnector")
.mode("append")
.option("table", "myDatabase.myTable")
.save()
যদি আপনি কোনও ডেটাফ্রেম থেকে একটি মাতাল টেবিল তৈরি করতে চান (যা বিদ্যমান নেই) (কিছু সময় এটি দিয়ে তৈরি করতে ব্যর্থ হয়
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
ডাটাবেস।