Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/installation/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在pyspark中高效地选择关键值镶木地板列_Apache Spark_Pyspark_Apache Spark Sql_Parquet - Fatal编程技术网

Apache spark 在pyspark中高效地选择关键值镶木地板列

Apache spark 在pyspark中高效地选择关键值镶木地板列,apache-spark,pyspark,apache-spark-sql,parquet,Apache Spark,Pyspark,Apache Spark Sql,Parquet,我正在处理一个相当大的拼花地板表,99.9%的数据包含在一个key:value列中。例如: #无法使用配置单元元存储访问,因此必须以这种方式加载 df=火花.阅读.拼花地板('hdfs://cluster/path/to/parquet') \ .select('id','version','details') df.printSchema() >>根 |--id:字符串 |--版本:字符串 |--详情:地图 ||--键:字符串 ||--value:struct || |--complex_s

我正在处理一个相当大的拼花地板表,99.9%的数据包含在一个key:value列中。例如:

#无法使用配置单元元存储访问,因此必须以这种方式加载
df=火花.阅读.拼花地板('hdfs://cluster/path/to/parquet') \
.select('id','version','details')
df.printSchema()
>>根
|--id:字符串
|--版本:字符串
|--详情:地图
||--键:字符串
||--value:struct
|| |--complex_struct_1:struct
|| | |--复|u子结构|u 1:struct
|    |    |    |    |-- ...
|    |    |    |-- ...
|| |--complex_struct_2:struct
|| | |--复杂子结构:结构
|    |    |    |    |-- ...
|    |    |    |-- ...
|| |--complex_field_n:struct
有问题的列是
详细信息
,可能的键是
键1
键2
,两者都有,或者都没有。我的问题是如何有效地只选择属于
键1
的子字段(例如,选择
详细信息['key\u 1'].复杂结构1.复杂子结构1.字段


因为该表不在配置单元元存储中,所以我不相信我可以在这里使用spark.sql,或者如果有任何好处的话。我知道如何天真地加载数据库,选择整个details列,然后进行筛选,但鉴于details列绝对庞大(数千个字段),我只需要一小部分,如果可能的话,我想在这里利用columnar访问。这是我可以更有效地完成的,还是超出了拼花地板的功能范围?

您可以通过创建临时视图来使用Spark SQL:

df.createOrReplaceTempView('df')
df2 = spark.sql("""select details['key_1'].complex_struct_1.complex_substruct_1.field from df""")

它应该是高效的,并且应该只获取您需要的结果子集。您可以执行
df2.explain()
查看查询的实际执行方式。

您可以通过创建临时视图来使用Spark SQL:

df.createOrReplaceTempView('df')
df2 = spark.sql("""select details['key_1'].complex_struct_1.complex_substruct_1.field from df""")

它应该是高效的,并且应该只获取您需要的结果子集。您可以执行
df2.explain()
查看查询的实际执行情况。

感谢您的快速回答。这似乎更接近我要找的。对于拼花地板表上的键/值查找是否加载所有列,我很难找到好的文档。您是否知道有关如何评估
details['key_1']
的详细信息?看着执行计划,它似乎只取目标字段。@Brendan我相信执行计划会告诉你它是如何评估的。如果您对深层次的细节感兴趣,那么您必须仔细阅读源代码,但大多数情况下,执行计划应该提供您需要/想要的所有内容。谢谢您的快速回答。这似乎更接近我要找的。对于拼花地板表上的键/值查找是否加载所有列,我很难找到好的文档。您是否知道有关如何评估
details['key_1']
的详细信息?看着执行计划,它似乎只取目标字段。@Brendan我相信执行计划会告诉你它是如何评估的。如果你对深层次的细节感兴趣,你必须仔细阅读源代码,但大多数时候,执行计划应该提供你需要/想要的一切。
df.select(df.details['key\u 1'].complex\u struct\u 1.complex\u substruct\u 1.field)
?@MykolaZotko我正试图沿着这些思路做些事情,但该语法似乎不起作用:
TypeError:无效参数,不是类型为的字符串或列。对于列文字,请使用“lit”、“array”、“struct”或“create\u map”函数。
尝试
df.selectExpr(“详细信息['key\u 1'].complex\u struct\u 1.complex\u substruct\u 1.*)
选择(df.details['key\u 1'].complex\u substruct\u 1.field)
?@MykolaZotko我正沿着这些思路尝试一些东西,但该语法似乎不起作用:
TypeError:无效参数,不是类型为的字符串或列。对于列文字,请使用“lit”、“array”、“struct”或“create\u map”函数。
Try
df.selectExpr(“details['key\u 1'].complex\u struct\u 1.complex\u substruct\u 1.*)