إدراج

إدراج من استعلامات التحديد

INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] select_statement

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement

part_spec:
  : (part_col_name1=val1 [, part_col_name2=val2, ...])

إدراج بيانات في جدول أو قسم من جدول النتائج لعبارة تحديد. يتم إدراج البيانات حسب الترتيب (ترتيب الأعمدة) وليس بالأسماء.

ملاحظة

(دلتا ليك على أزور داتابريك) إذا كان عمود قيد NOT NULLNOT NULL، INSERT INTO وعبارة تعيين قيمة عمود إلى ، NULL يتم SparkException طرح.

OVERWRITE

الكتابة فوق البيانات الموجودة في الجدول أو القسم. وإلا، يتم إلحاق بيانات جديدة.

أمثلة

-- Creates a partitioned native parquet table
CREATE TABLE data_source_tab1 (col1 INT, p1 INT, p2 INT)
  USING PARQUET PARTITIONED BY (p1, p2)

-- Appends two rows into the partition (p1 = 3, p2 = 4)
INSERT INTO data_source_tab1 PARTITION (p1 = 3, p2 = 4)
  SELECT id FROM RANGE(1, 3)

-- Overwrites the partition (p1 = 3, p2 = 4) using two new rows
INSERT OVERWRITE TABLE default.data_source_tab1 PARTITION (p1 = 3, p2 = 4)
  SELECT id FROM RANGE(3, 5)

إدراج قيم في جداول

INSERT INTO [TABLE] [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] VALUES values_row [, values_row ...]

values_row:
    : (val1 [, val2, ...])

إدراج بيانات في جدول أو قسم من قائمة قيم صف.

OVERWRITE

الكتابة فوق البيانات الموجودة في الجدول أو القسم. وإلا، يتم إلحاق بيانات جديدة.

أمثلة

-- Creates a partitioned hive serde table (using the HiveQL syntax)
CREATE TABLE hive_serde_tab1 (col1 INT, p1 INT, p2 INT)
  USING HIVE OPTIONS(fileFormat 'PARQUET') PARTITIONED BY (p1, p2)

-- Appends two rows into the partition (p1 = 3, p2 = 4)
INSERT INTO hive_serde_tab1 PARTITION (p1 = 3, p2 = 4)
  VALUES (1), (2)

-- Overwrites the partition (p1 = 3, p2 = 4) using two new rows
INSERT OVERWRITE TABLE hive_serde_tab1 PARTITION (p1 = 3, p2 = 4)
  VALUES (3), (4)

إدراج القسم الديناميكي

في part_spec ، تكون قيم عمود القسم اختيارية. عندما لا يتم توفير مواصفات القسم part_spec بالكامل، تسمى إدراجات مثل هذه part_spec أو إدراج أقسام متعددة. عندما لا يتم تحديد القيم، تتم الإشارة إلى هذه الأعمدة كأعمدة أقسام ديناميكية؛ وإلا، فهي أعمدة أقسام ثابتة. على سبيل المثال، يحتوي على المواصفات قسم (p1 = 3, p2, p3) عمود تقسيم ثابت ( ) و p1 عمودين القسم الحيوي ( و p2p3 ).

في part_spec ، يجب أن تأتي مفاتيح الأقسام الثابتة قبل مفاتيح القسم الديناميكية. وهذا يعني أن كافة أعمدة الأقسام التي لها قيم ثابتة يجب أن تظهر قبل أعمدة أقسام أخرى ليس لها قيمة ثابتة معينة.

يتم تحديد قيم القسم لأعمدة الأقسام الحيوية أثناء التنفيذ. يجب تحديد أعمدة القسم الحيوية الأخيرة في كل من part_spec ومجموعة نتائج الإدخال (من قوائم قيم الصف أو استعلام التحديد). يتم حلها حسب الموقف، بدلا من الأسماء. وبالتالي، يجب أن تكون الأوامر متطابقة تماما.

واجهات برمجة التطبيقات DataFrameWriter ليس لديها واجهة لتحديد قيم القسم. لذلك، insertInto() API يستخدم وضع القسم الحيوي دوما.

هام

في وضع القسم الحيوي، قد ينتج عن مجموعة نتائج الإدخال عدد كبير من الأقسام الديناميكية، وبالتالي إنشاء عدد كبير من دلائل القسم.

OVERWRITE

تختلف الدلالات استنادا إلى نوع الجدول الهدف.

  • جداول الخلية SerDe: INSERT OVERWRITE لا تحذف الأقسام التي تنتظرك، ولا تقوم بالكتابة فوق الأقسام التي تحتوي على بيانات مكتوبة فيها في وقت التشغيل. هذا يطابق دلالات خلية الأباتشي. بالنسبة لجداول Hive SerDe، يحترم Spark SQL التكوين المرتبط بخلية الخلية، بما في ذلك hive.exec.dynamic.partition و hive.exec.dynamic.partition.mode .
  • جداول مصدر البيانات الأصلية: INSERT OVERWRITE أولا حذف كافة الأقسام التي تطابق مواصفات القسم (على سبيل المثال، PARTITION(a=1، b)) ثم إدراج كافة القيم المتبقية. يمكن تغيير سلوك جداول مصدر البيانات الأصلية لتكون متناسقة مع جداول خلية SerDe عن طريق تغيير التكوين الخاص بجلسة العمل spark.sql.sources.partitionOverwriteMode إلى DYNAMIC . الوضع الافتراضي هو STATIC .

أمثلة

-- Create a partitioned native Parquet table
CREATE TABLE data_source_tab2 (col1 INT, p1 STRING, p2 STRING)
  USING PARQUET PARTITIONED BY (p1, p2)

-- Two partitions ('part1', 'part1') and ('part1', 'part2') are created by this dynamic insert.
-- The dynamic partition column p2 is resolved by the last column `'part' || id`
INSERT INTO data_source_tab2 PARTITION (p1 = 'part1', p2)
  SELECT id, 'part' || id FROM RANGE(1, 3)

-- A new partition ('partNew1', 'partNew2') is added by this INSERT OVERWRITE.
INSERT OVERWRITE TABLE data_source_tab2 PARTITION (p1 = 'partNew1', p2)
  VALUES (3, 'partNew2')

-- After this INSERT OVERWRITE, the two partitions ('part1', 'part1') and ('part1', 'part2') are dropped,
-- because both partitions are included by (p1 = 'part1', p2).
-- Then, two partitions ('partNew1', 'partNew2'), ('part1', 'part1') exist after this operation.
INSERT OVERWRITE TABLE data_source_tab2 PARTITION (p1 = 'part1', p2)
  VALUES (5, 'part1')

-- Create and fill a partitioned hive serde table with three partitions:
-- ('part1', 'part1'), ('part1', 'part2') and ('partNew1', 'partNew2')
CREATE TABLE hive_serde_tab2 (col1 INT, p1 STRING, p2 STRING)
  USING HIVE OPTIONS(fileFormat 'PARQUET') PARTITIONED BY (p1, p2)
INSERT INTO hive_serde_tab2 PARTITION (p1 = 'part1', p2)
  SELECT id, 'part' || id FROM RANGE(1, 3)
INSERT OVERWRITE TABLE hive_serde_tab2 PARTITION (p1 = 'partNew1', p2)
  VALUES (3, 'partNew2')

-- After this INSERT OVERWRITE, only the partitions ('part1', 'part1') is overwritten by the new value.
-- All the three partitions still exist.
INSERT OVERWRITE TABLE hive_serde_tab2 PARTITION (p1 = 'part1', p2)
  VALUES (5, 'part1')

إدراج قيم في الدليل

INSERT OVERWRITE [LOCAL] DIRECTORY [directory_path]
  USING data_source [OPTIONS (key1=val1, key2=val2, ...)]
  [AS] SELECT ... FROM ...

إدراج نتائج الاستعلام select_statement في دليل باستخدام تنسيق Spark directory_path الأصلي. إذا كان المسار المحدد موجودا، يتم استبداله بإخراج select_statement .

DIRECTORY

مسار الدليل الوجهة من إدراج. يمكن أيضا تحديد الدليل OPTIONS باستخدام المفتاح path . إذا كان المسار المحدد موجودا، يتم استبداله بإخراج select_statement . إذا LOCAL تم استخدامه، الدليل على نظام الملفات المحلية.

USING

تنسيق الملف لاستخدامه في الإدراج. واحد من TEXT ، ، ، ، ، ، ، ، و ، CSV أو JSON اسم JDBCPARQUETORCHIVELIBSVM فئة مؤهل بالكامل لتطبيق مخصص من org.apache.spark.sql.sources.DataSourceRegister .

AS

تعبئة الدليل الوجهة ببيانات الإدخال من عبارة التحديد.

أمثلة

INSERT OVERWRITE DIRECTORY
USING parquet
OPTIONS ('path' '/tmp/destination/path')
SELECT key, col1, col2 FROM source_table

INSERT OVERWRITE DIRECTORY '/tmp/destination/path'
USING json
SELECT 1 as a, 'c' as b

إدراج قيم في الدليل بتنسيق الخلية

INSERT OVERWRITE [LOCAL] DIRECTORY directory_path
  [ROW FORMAT row_format] [STORED AS file_format]
  [AS] select_statement

إدراج نتائج الاستعلام select_statement في دليل باستخدام الخلية directory_path SerDe. إذا كان المسار المحدد موجودا، يتم استبداله بإخراج select_statement .

ملاحظة

يتم اعتماد هذا الأمر فقط عند تمكين دعم الخلية.

DIRECTORY

مسار الدليل الوجهة من إدراج. إذا كان المسار المحدد موجودا، سيتم استبداله بإخراج select_statement . إذا LOCAL تم استخدامه، الدليل على نظام الملفات المحلية.

ROW FORMAT

استخدم SERDE العبارة لتحديد SerDe مخصص لهذا الإدراج. وإلا، استخدم DELIMITED العبارة لاستخدام SerDe الأصلي وحدد محدد أو حرف الهروب أو حرف null وهكذا.

STORED AS

تنسيق الملف لهذا الإدراج. واحد من TEXTFILE , , , , , و SEQUENCEFILERCFILEORCPARQUETAVRO . بدلا من ذلك، يمكنك تحديد تنسيق الإدخال والإخراج الخاص بك من خلال INPUTFORMAT و OUTPUTFORMAT . فقط TEXTFILESEQUENCEFILE ، ويمكن استخدامه مع ، RCFILE ويمكن استخدامه فقط مع ROW FORMAT SERDETEXTFILEROW FORMAT DELIMITED .

AS

تعبئة الدليل الوجهة ببيانات الإدخال من عبارة التحديد.

أمثلة

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/destination/path'
STORED AS orc
SELECT * FROM source_table where key < 10