Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.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
在R中使用SparklyR更改嵌套列名_R_Apache Spark_Sparklyr - Fatal编程技术网

在R中使用SparklyR更改嵌套列名

在R中使用SparklyR更改嵌套列名,r,apache-spark,sparklyr,R,Apache Spark,Sparklyr,我已经参考了这里提到的所有链接: 1) 2)3)4) 下面的R代码是使用SparkyR包编写的。它读取巨大的JSON文件并创建数据库模式 sc <- spark_connect(master = "local", config = conf, version = '2.2.0') # Connection sample_tbl <- spark_read_json(sc,name="example",path="example.json", header = TRUE,

我已经参考了这里提到的所有链接:

1) 2)3)4)

下面的R代码是使用SparkyR包编写的。它读取巨大的JSON文件并创建数据库模式

sc <- spark_connect(master = "local", config = conf, version = '2.2.0') # Connection
sample_tbl <- spark_read_json(sc,name="example",path="example.json", header = TRUE, 
                              memory = FALSE, overwrite = TRUE) # reads JSON file
sample_tbl <- sdf_schema_viewer(sample_tbl) # to create db schema
df <- tbl(sc,"example") # to create lookup table
但当我运行第二个深层嵌套列时,它不会重命名

df %>% rename(e_hashtags = entities.hashtags)
它显示错误:

在.f(.x[[i]],…)中出错:找不到对象“entities.hashtags”
问题

我的问题是,如何将第三到第四个深层嵌套列也重命名


请参考上述数据库架构。

Spark不支持重命名单个嵌套字段。您必须铸造或重建整个结构。为简单起见,假设数据如下所示:

cat('{"contributors": "foo", "coordinates": "bar", "entities": {"hashtags": ["foo", "bar"], "media": "missing"}}',  file = "/tmp/example.json")
df <- spark_read_json(sc, "df", "/tmp/example.json", overwrite=TRUE)

df %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
使用简单的字符串表示法:

df %>% 
  spark_dataframe() %>% 
  invoke("schema") %>% 
  invoke("simpleString") %>% 
  cat(sep = "\n")
struct
使用cast时,必须使用匹配的类型描述定义表达式:

expr_cast <- invoke_static(
  sc, "org.apache.spark.sql.functions", "expr",
  "CAST(entities AS struct<e_hashtags:array<string>,media:string>)"
)

df_cast <- df %>% 
  spark_dataframe() %>% 
  invoke("withColumn", "entities", expr_cast) %>% 
  sdf_register()

df_cast %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
要重建结构,必须匹配所有组件:

expr_struct <- invoke_static(
  sc, "org.apache.spark.sql.functions", "expr",
  "struct(entities.hashtags AS e_hashtags, entities.media)"
)

df_struct <- df %>% 
  spark_dataframe() %>% 
  invoke("withColumn", "entities", expr_struct) %>% 
  sdf_register()

df_struct %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()

Spark本身不支持重命名单个嵌套字段。您必须铸造或重建整个结构。为简单起见,假设数据如下所示:

cat('{"contributors": "foo", "coordinates": "bar", "entities": {"hashtags": ["foo", "bar"], "media": "missing"}}',  file = "/tmp/example.json")
df <- spark_read_json(sc, "df", "/tmp/example.json", overwrite=TRUE)

df %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
使用简单的字符串表示法:

df %>% 
  spark_dataframe() %>% 
  invoke("schema") %>% 
  invoke("simpleString") %>% 
  cat(sep = "\n")
struct
使用cast时,必须使用匹配的类型描述定义表达式:

expr_cast <- invoke_static(
  sc, "org.apache.spark.sql.functions", "expr",
  "CAST(entities AS struct<e_hashtags:array<string>,media:string>)"
)

df_cast <- df %>% 
  spark_dataframe() %>% 
  invoke("withColumn", "entities", expr_cast) %>% 
  sdf_register()

df_cast %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()
要重建结构,必须匹配所有组件:

expr_struct <- invoke_static(
  sc, "org.apache.spark.sql.functions", "expr",
  "struct(entities.hashtags AS e_hashtags, entities.media)"
)

df_struct <- df %>% 
  spark_dataframe() %>% 
  invoke("withColumn", "entities", expr_struct) %>% 
  sdf_register()

df_struct %>% spark_dataframe() %>% invoke("schema") %>% invoke("treeString") %>% cat()

这对这个答案没有任何实际影响。列始终是标识的,但其完全限定名是。只有在极少数情况下,在相同的路径上有相同名称的列(比如说有
实体.url
实体.url
——这是边界情况,通常表示管道中的错误或严重的数据问题)。您必须重新创建整个结构。如果有多个嵌套级别,则需要多个嵌套结构来反映
struct(…、struct(…)
等等。然而,并不是所有的结构都能像这样建造。这并不影响这个答案在任何实际的方面。列始终是标识的,但其完全限定名是。只有在极少数情况下,在相同的路径上有相同名称的列(比如说有
实体.url
实体.url
——这是边界情况,通常表示管道中的错误或严重的数据问题)。您必须重新创建整个结构。如果有多个嵌套级别,则需要多个嵌套结构来反映
struct(…、struct(…)
等等。然而,并非所有结构都可以这样建造。