_metadata
열을 사용하여 입력 파일에 대한 메타데이터 정보를 가져올 수 있습니다.
_metadata
열은 숨겨진 열이며 모든 입력 파일 형식에 사용할 수 있습니다. 반환된 _metadata
DataFrame에 열을 포함하려면 원본을 지정하는 읽기 쿼리에서 명시적으로 선택해야 합니다.
데이터 원본에 _metadata
열이 포함된 경우 쿼리는 파일 메타데이터가 아닌 데이터 원본에서 열을 반환합니다.
경고
새 필드는 이후 릴리스에서 _metadata
열에 추가될 수 있습니다.
_metadata
열이 업데이트되는 경우 스키마 진화 오류를 방지하기 위해 Databricks는 쿼리의 열에서 특정 필드를 선택하는 것이 좋습니다.
예를 참조하세요.
지원되는 메타데이터
_metadata
열은 다음 필드를 포함하고 있는 STRUCT
.
이름 | 유형 | 설명 | 예시 | 최소한의 "Databricks" 런타임 릴리스 |
---|---|---|---|---|
file_path | STRING |
입력 파일의 파일 경로입니다. | file:/tmp/f0.csv |
10.5 |
file_name | STRING |
해당 확장이 포함된 입력 파일의 이름입니다. | f0.csv |
10.5 |
file_size | LONG |
입력 파일의 길이(바이트)입니다. | 628 | 10.5 |
파일_수정_시간 | TIMESTAMP |
입력 파일의 마지막 수정 타임스탬프입니다. | 2021-12-20 20:05:21 |
10.5 |
file_block_start | LONG |
읽는 블록의 시작 오프셋(바이트)입니다. | 0 | 13.0 |
파일_블록_길이 | LONG |
읽는 블록의 길이(바이트)입니다. | 628 | 13.0 |
예시
기본 파일 기반 데이터 원본 판독기에서 사용
파이썬
df = spark.read \
.format("csv") \
.schema(schema) \
.load("dbfs:/tmp/*") \
.select("*", "_metadata")
display(df)
'''
Result:
+---------+-----+----------------------------------------------------+
| name | age | _metadata |
+=========+=====+====================================================+
| | | { |
| | | "file_path": "dbfs:/tmp/f0.csv", |
| Debbie | 18 | "file_name": "f0.csv", |
| | | "file_size": 12, |
| | | "file_block_start": 0, |
| | | "file_block_length": 12, |
| | | "file_modification_time": "2021-07-02 01:05:21" |
| | | } |
+---------+-----+----------------------------------------------------+
| | | { |
| | | "file_path": "dbfs:/tmp/f1.csv", |
| Frank | 24 | "file_name": "f1.csv", |
| | | "file_size": 12, |
| | | "file_block_start": 0, |
| | | "file_block_length": 12, |
| | | "file_modification_time": "2021-12-20 02:06:21" |
| | | } |
+---------+-----+----------------------------------------------------+
'''
스칼라
val df = spark.read
.format("csv")
.schema(schema)
.load("dbfs:/tmp/*")
.select("*", "_metadata")
display(df_population)
/* Result:
+---------+-----+----------------------------------------------------+
| name | age | _metadata |
+=========+=====+====================================================+
| | | { |
| | | "file_path": "dbfs:/tmp/f0.csv", |
| Debbie | 18 | "file_name": "f0.csv", |
| | | "file_size": 12, |
| | | "file_block_start": 0, |
| | | "file_block_length": 12, |
| | | "file_modification_time": "2021-07-02 01:05:21" |
| | | } |
+---------+-----+----------------------------------------------------+
| | | { |
| | | "file_path": "dbfs:/tmp/f1.csv", |
| Frank | 24 | "file_name": "f1.csv", |
| | | "file_size": 10, |
| | | "file_block_start": 0, |
| | | "file_block_length": 12, |
| | | "file_modification_time": "2021-12-20 02:06:21" |
| | | } |
+---------+-----+----------------------------------------------------+
*/
특정 필드 선택
파이썬
spark.read \
.format("csv") \
.schema(schema) \
.load("dbfs:/tmp/*") \
.select("_metadata.file_name", "_metadata.file_size")
스칼라
spark.read
.format("csv")
.schema(schema)
.load("dbfs:/tmp/*")
.select("_metadata.file_name", "_metadata.file_size")
필터에서 사용
파이썬
spark.read \
.format("csv") \
.schema(schema) \
.load("dbfs:/tmp/*") \
.select("*") \
.filter(col("_metadata.file_name") == lit("test.csv"))
스칼라
spark.read
.format("csv")
.schema(schema)
.load("dbfs:/tmp/*")
.select("*")
.filter(col("_metadata.file_name") === lit("test.csv"))
COPY INTO (레거시)에서 사용
COPY INTO my_delta_table
FROM (
SELECT *, _metadata FROM 'abfss://my-container-name@storage-account-name.dfs.core.windows.net/csvData'
)
FILEFORMAT = CSV
자동 로더에서 사용
원본 데이터에 이름이 지정된 열이 포함된 경우 이름을 _metadata
.로 바꿉니다 source_metadata
. 이름을 바꾸지 않으면 대상 테이블의 파일 메타데이터 열에 액세스할 수 없습니다. 쿼리는 대신 원본 열을 반환합니다.
파이썬
spark.readStream \
.format("cloudFiles") \
.option("cloudFiles.format", "csv") \
.schema(schema) \
.load("abfss://my-container-name@storage-account-name.dfs.core.windows.net/csvData") \
.selectExpr("*", "_metadata as source_metadata") \
.writeStream \
.option("checkpointLocation", checkpointLocation) \
.start(targetTable)
스칼라
spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "csv")
.schema(schema)
.load("abfss://my-container-name@storage-account-name.dfs.core.windows.net/csvData")
.selectExpr("*", "_metadata as source_metadata")
.writeStream
.option("checkpointLocation", checkpointLocation)
.start(targetTable)
foreachBatch를 사용하고 스트리밍 데이터 프레임에 파일 메타데이터 열을 포함하려는 경우, foreachBatch
함수 호출 전에 스트리밍 읽기 DataFrame에서 이를 참조해야 합니다. 함수 내의 파일 메타데이터 열만 참조하는 foreachBatch
경우 열은 포함되지 않습니다.
파이썬
spark.readStream \
.format("cloudFiles") \
.option("cloudFiles.format", "csv") \
.load("abfss://my-container-name@storage-account-name.dfs.core.windows.net/csvData") \
.select("*", "metadata") \
.writeStream \
.foreachBatch(...)
스칼라
spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "csv")
.load("abfss://my-container-name@storage-account-name.dfs.core.windows.net/csvData")
.select("*", "metadata")
.writeStream
.foreachBatch(...)